Команда AT + CIMI с использованием pyserial приводит к пустой строке - PullRequest
0 голосов
/ 11 июля 2019

При подключении к телефону Android через Putty и отправке команды + cimi отображается мой номер IMSI. (XX [..] XX - числовые значения)

при + CIMI
XXXXXXXXXXXXXXX

OK

С кодом ниже Python (по команде g + cgpaddr):

def open_serial(com_port):
    my_serial = serial.Serial(com_port, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=1, rtscts=0)
    return my_serial

s = open_serial('COM35')
s.write(b'at+cgpaddr\r')
temp = s.readlines()
print(temp)

Вывод:

[b'at+cgpaddr\r\r\n', b'+CGPADDR: 1,"XXX.XXXX.XXX.XXX"\r\n', b'\r\n', b'OK\r\n']

Если я изменю только на + cgpaddr на + cimi:

s = open_serial('COM35')
s.write(b'at+cimi\r')
temp = s.readlines()
print(temp)

В результате получается пустая строка:

[]

Есть ли решение этой проблемы?

Ответы [ 3 ]

0 голосов
/ 12 июля 2019

Просто мысль: вы уверены, что вам нужно программное управление потоком, чтобы быть активным? Если вы используете XON-XOFF, есть некоторые конкретные байтовые значения, которые используются для управления связью. Это может помешать вашему общению, если вам не повезло.

И еще одна мысль: некоторые AT-команды занимают более 1 секунды, чтобы убедиться, что вы не сдаетесь, прежде чем получите ответ, вам лучше увеличить время ожидания до 5-10 секунд.

0 голосов
/ 23 июля 2019

Если кто-то сталкивался с этой проблемой, я решил ее, добавив пробелы между "at" и "cimi".

До: s.write(b'at+cimi\r')

После того, как: s.write(b'at + cimi\r')

Не знаю почему, но это работает. Проверено на другом телефоне, ПК работает с обеими версиями.

0 голосов
/ 12 июля 2019

Попробуйте добавить время ожидания перед s.readlines ()

ser.timeout=1.0

На самом деле, я не понимаю, почему он работает с cgpaddr на вашей стороне.Без таймаута readlines никогда не вернется на мою сторону.

Вот комментарии из pyserial doc,

Будьте осторожны при использовании readline ().Укажите тайм-аут при открытии последовательного порта, иначе он может заблокироваться навсегда, если символ новой строки не получен.Также обратите внимание, что readlines () работает только с таймаутом.readlines () зависит от времени ожидания и интерпретирует его как EOF (конец файла).Возникает исключение, если порт открыт неправильно.

...