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

Abr*_*ham 13 python modem gsm at-command python-3.x

我想用我的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()
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我收到了这个输出:

>>> ================================ RESTART ================================
>>> 
b'ATZ\r\r\n'
b'OK\r\n'
b'ATDxxxxxxxxxx\r\r\n'
b'NO CARRIER\r\n'
Run Code Online (Sandbox Code Playgroud)

这个"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()
Run Code Online (Sandbox Code Playgroud)

Abr*_*ham 23

我找到了错误的起源:

语法ATD+98xxxxxxxxxx;之后是终止字符串.我忘记在数字后面加分号.

所以我更换

phone.write(b'ATD"'+recipient.encode() +b'"\r')
Run Code Online (Sandbox Code Playgroud)

phone.write(b'ATD"'+recipient.encode() +b';"\r')
Run Code Online (Sandbox Code Playgroud)

现在它工作正常.


根据文档中的括号,我认为使用";" 是可选的.但似乎我错了. 在此输入图像描述

  • 嗨nlovdal,我的命令ATD + 39**********有"NO CARRIER"错误; .SIM解锁(AT + CPIN?返回READY),信号质量正常(AT + CSQ返回9,3)并且它已正确注册到网络(AT + COPS?返回0,0,"vodafone IT",2) .有什么建议可以解决这个问题吗? (3认同)
  • 就个人而言,我会使用:`phone.write(b'ATD"%s";\r'%recipient.encode())`更清楚地发生了什么,更紧凑. (2认同)