“接收”;“无承运人”;在Python中尝试使用GSM调制解调器拨打电话时出错

“接收”;“无承运人”;在Python中尝试使用GSM调制解调器拨打电话时出错,python,python-3.x,gsm,at-command,modem,Python,Python 3.x,Gsm,At Command,Modem,我想用我的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() +

我想用我的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'
这个“无承运人”错误是什么意思?

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


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

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()

我找到了错误的根源:

语法为
ATD+98xxxxxxxxx后跟终止字符串。我忘了在数字后面加分号

所以我换了

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

现在它工作得很好


基于文档中的括号,我认为使用“;”是可选的。但似乎我错了。

您可以发布您的短信发送代码吗?我很确定我知道这是什么happening@tristan我更新了问题。我个人会使用:
phone.write(b'ATD“%s”\r“%recipient.encode())
更清晰,更紧凑。为了分号的完整性:
ATD
命令有一个
L
修饰符,使调制解调器拨最后一个拨出的号码。因此,如果您首先使用
ATD1234
启动一个数据呼叫,那么您可以在该呼叫结束后,使用
ATDL
为同一号码设置一个新的数据呼叫。这里不太明显的问题是语音通话。如果您首先使用
ATD1234设置语音通话
然后只给出
ATDL
将设置对号码1234的数据呼叫,因此调制解调器只重用号码,而不重用呼叫类型。如果你想重复语音通话,你必须给出
ATDL结尾用分号。@hlovdal谢谢你亲爱的朋友。请问语音电话和数据电话有什么区别?我是否也可以使用拨号调制解调器发起数据呼叫,或者仅用于GSM调制解调器?您好,我的命令ATD+39*********;“无载波”错误。SIM卡已解锁(AT+CPIN?返回就绪),信号质量正常(AT+CSQ返回9,3),并且已正确注册到网络(AT+COPS?返回0,0,“沃达丰It”,2)。有没有解决这个问题的建议?@aldo85ita我也有同样的错误。你找到答案了吗?
phone.write(b'ATD"'+recipient.encode() +b';"\r')