2015-06-20 1 views
4

Я хочу позвонить, используя мой GSM-модем. Так что я написал ниже программу:Получение ошибки «NO CARRIER» во время tring для совершения вызова с использованием GSM-модема в Python

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»?

Обратите внимание, что я могу отправить SMS успешно.


Это программа, которую я использую для отправки 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() 
+0

Вы можете отправить свой код отправки SMS? Я уверен, что знаю, что происходит –

+0

@tristan Я обновляю вопрос. – Abraham

ответ

11

Я нашел источник ошибки:

Синтаксис является 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

Смежные вопросы