在使用Python中的GSM调制解调器拨打电话时收到“NO CARRIER”错误
我想用我的GSM调制解调器拨打电话。所以我写了下面的程序:在使用Python中的GSM调制解调器拨打电话时收到“NO CARRIER”错误
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()
我找到了错误的起源:
的语法是ATD+98xxxxxxxxxx;
随后终止字符串。号码后我忘了在分号处加分号。
所以我代替
phone.write(b'ATD"'+recipient.encode() +b'"\r')
与
phone.write(b'ATD"'+recipient.encode() +b';"\r')
而现在它工作正常。
根据this文件中的括号,我认为使用“;”是可选的。但似乎我错了。
就个人而言,我会使用:'phone.write(b'ATD“%s”; \ r'%recipient.encode())'作为更清晰的事情,并且更加紧凑。 –
关于分号的完整性:'ATD'命令有一个'L'修饰符,它使调制解调器拨打最后一个拨号号码。所以,如果你首先用'ATD1234'开始数据呼叫,那么你可以在呼叫结束后给'ATDL'设置一个新的数据呼叫到同一个号码。这里没有那么明显的问题是语音通话。如果您首先使用ATD1234设置**语音呼叫**,则只需给出ATDL就会将数据呼叫**设置为编号1234,因此调制解调器只会重复使用该号码而不是呼叫。如果你想重复一次语音呼叫,你必须在最后给一个分号“ATDL;”。 – hlovdal
@ hlovdal谢谢亲爱的朋友。我可以请你说我的语音通话和数据通话有什么区别吗?我是否也可以使用拨号调制解调器发起数据呼叫,还是仅用于GSM调制解调器? – Abraham
你可以发布你的短信发送代码?我很确定我知道发生了什么 – 2015-06-20 09:07:06
@tristan我更新了问题。 – Abraham