在使用Python中的GSM调制解调器拨打电话时收到“NO CARRIER”错误

在使用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() 
+0

你可以发布你的短信发送代码?我很确定我知道发生了什么 – 2015-06-20 09:07:06

+0

@tristan我更新了问题。 – Abraham

我找到了错误的起源:

的语法是ATD+98xxxxxxxxxx;随后终止字符串。号码后我忘了在分号处加分号。

所以我代替

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

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

而现在它工作正常。


根据this文件中的括号,我认为使用“;”是可选的。但似乎我错了。 enter image description here

+1

就个人而言,我会使用:'phone.write(b'ATD“%s”; \ r'%recipient.encode())'作为更清晰的事情,并且更加紧凑。 –

+1

关于分号的完整性:'ATD'命令有一个'L'修饰符,它使调制解调器拨打最后一个拨号号码。所以,如果你首先用'ATD1234'开始数据呼叫,那么你可以在呼叫结束后给'ATDL'设置一个新的数据呼叫到同一个号码。这里没有那么明显的问题是语音通话。如果您首先使用ATD1234设置**语音呼叫**,则只需给出ATDL就会将数据呼叫**设置为编号1234,因此调制解调器只会重复使用该号码而不是呼叫。如果你想重复一次语音呼叫,你必须在最后给一个分号“ATDL;”。 – hlovdal

+0

@ hlovdal谢谢亲爱的朋友。我可以请你说我的语音通话和数据通话有什么区别吗?我是否也可以使用拨号调制解调器发起数据呼叫,还是仅用于GSM调制解调器? – Abraham