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

Posted

技术标签:

【中文标题】尝试在 Python 中使用 GSM 调制解调器拨打电话时收到“NO CARRIER”错误【英文标题】:Receiving "NO CARRIER" error while tring to make a call using GSM modem in Python 【发布时间】:2015-09-06 06:13:31 【问题描述】:

我想使用我的 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()

【问题讨论】:

您能发布您的短信发送代码吗?我很确定我知道发生了什么 @tristan 我更新了问题。 【参考方案1】:

我找到了错误的根源:

语法是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 谢谢你亲爱的朋友。请问您能告诉我语音通话和数据通话有什么区别吗?我也可以使用拨号调制解调器发起数据呼叫,还是仅用于 GSM 调制解调器? 您好 nlovdal,我的命令 ATD+39********** 出现“NO CARRIER”错误; . SIM 已解锁(AT+CPIN? 返回 READY),信号质量正常(AT+CSQ 返回 9,3)并且已正确注册到网络(AT+COPS? 返回 0,0,"vodafone IT",2) .有什么解决这个问题的建议吗? @aldo85ita 我也遇到了同样的错误。你找到答案了吗?

以上是关于尝试在 Python 中使用 GSM 调制解调器拨打电话时收到“NO CARRIER”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在通话期间通过 GSM 调制解调器发送和接收一些数据(Python 和 AT 命令)

编写 GSM 调制解调器驱动程序?

识别GSM加密算法

Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

如何通过USB GSM调制解调器从VB应用程序发送短信(华为E1731)

GSM调制解调器的反应太迟了