web-dev-qa-db-fra.com

Réception d'une erreur "NO CARRIER" lors de la tentative d'appel via un modem GSM dans Python

Je souhaite passer un appel à l'aide de mon modem GSM. J'ai donc écrit le programme ci-dessous:

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

Mais quand je l'exécute, je reçois cette sortie:

>>> ================================ RESTART ================================
>>> 
b'ATZ\r\r\n'
b'OK\r\n'
b'ATDxxxxxxxxxx\r\r\n'
b'NO CARRIER\r\n'

Que signifie cette erreur "NO CARRIER"?

Notez que je peux envoyer SMS avec succès.


Voici le programme que j'utilise pour envoyer des SMS:

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

J'ai trouvé l'origine de l'erreur:

La syntaxe est ATD+98xxxxxxxxxx; suivi d'une chaîne de terminaison. J'ai oublié de mettre un point-virgule à la fin après le numéro.

Donc je remplace

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

avec

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

Et maintenant ça marche bien.


Sur la base des crochets dans les documents this , j'ai pensé qu'en utilisant ";" est facultatif. Mais il semble que j'avais tort. enter image description here

22
Abraham