使用Python的GSM调制解调器进行通话时,收到“NO CARRIER”错误。

18

我想使用我的GSM调制解调器打电话。 因此,我编写了以下程序:

import time
import serial

recipient = "+98xxxxxxxxxx"

phone = serial.Serial("COM10",  115200, timeout=5)
try:
    time.sleep(0.5)
    phone.write(b'ATZ\r')
    time.sleep(1)
    phone.write(b'ATD"'+recipient.encode() +b'"\r')
    while(1):
        print(phone.readline())
    time.sleep(0.5)
finally:
    phone.close()

但是当我运行它时,我收到以下输出:

>>> ================================ RESTART ================================
>>> 
b'ATZ\r\r\n'
b'OK\r\n'
b'ATDxxxxxxxxxx\r\r\n'
b'NO CARRIER\r\n'

"NO CARRIER"错误是什么意思?

请注意,我可以成功发送短信。


这是我用来发送短信的程序:

import time
import serial

recipient = "+98xxxxxxxxxx"
message = "Test"

phone = serial.Serial("COM10",  115200, timeout=5)


try:
    time.sleep(0.5)
    phone.write(b'ATZ\r')
    time.sleep(0.5)
    phone.write(b'AT+CMGF=1\r')
    time.sleep(0.5)
    phone.write(b'AT+CMGS="' + recipient.encode() + b'"\r')
    time.sleep(0.5)
    phone.write(message.encode() + b"\r")
    time.sleep(0.5)
    phone.write(bytes([26]))
    time.sleep(0.5)
finally:
    phone.close()

你能发一下你的短信发送代码吗?我相当确定我知道出了什么问题。 - user559633
@tristan,我更新了问题。 - Ebrahim Ghasemi
1个回答

38

我找到了错误的来源:

语法是 ATD+98xxxxxxxxxx; 后面跟着一个终止字符串。我忘记在数字后面加上分号了。

所以我进行了替换

phone.write(b'ATD"'+recipient.encode() +b'"\r')

随着

phone.write(b'ATD"'+recipient.encode() +b';"\r')

现在它正常工作。


根据这份文件中的方括号,我认为使用";"是可选的。但是看起来我错了。 enter image description here


2
个人而言,我会使用 phone.write(b'ATD"%s";\r' % recipient.encode()),因为它更清晰地表明了正在发生的事情,并且更加紧凑。 - Steve Barnes
1
关于分号的完整性:ATD命令有一个L修饰符,使调制解调器拨打最后一次拨打的号码。因此,如果您首先使用ATD1234开始数据呼叫,然后在该呼叫结束后输入ATDL以建立到相同号码的新数据呼叫。这里不太明显的问题是针对语音呼叫。如果您首先使用ATD1234;建立语音呼叫,那么只需输入ATDL即可建立到号码1234的数据呼叫,因此调制解调器仅重用号码而不是呼叫类型。如果您想重复语音呼叫,则必须在末尾加上分号ATDL; - hlovdal
@hlovdal 谢谢亲爱的朋友。我可以问一下语音通话和数据通话之间有什么区别吗?我能否使用拨号调制解调器发起数据通话,还是仅适用于GSM调制解调器? - Ebrahim Ghasemi
3
你好nlovdal,我在使用命令ATD+39**********时遇到了“NO CARRIER”错误。SIM卡已解锁(AT+CPIN?返回READY),信号质量也正常(AT+CSQ返回9,3),并且已经成功注册到网络(AT+COPS?返回0,0,“vodafone IT”,2)。你有什么建议可以解决这个问题吗? - aldo85ita
@aldo85ita 我也遇到了同样的错误。你找到答案了吗? - Anto sujesh
1
我发现收到“NO CARRIER”信息也可能意味着你没有剩余通话时间可以拨打电话。 - Danie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接