Итак, я пытаюсь установить связь с модулем zigbee, подключенным к последовательному порту, с помощью команд AT (иногда называемых Hayes).проблемы при чтении с помощью pyserial
Моя проблема: я не могу понять, как правильно читать ответы с помощью pyserial модуля Python (я использую Python 2.7 на встроенном устройстве).
Иногда скрипту удается отлично читать ответы модуля, а иногда он просто возвращает набор символов «А».
Вот пример вывода:
серийный Открытие/DEV/ttyS2 ... /DEV/ttyS2 открыт ...
Введите команду или 'выход': AT
------------- ------------- Response
AT OK
Введите команду или 'выход': ATI
------------- ------------- Response aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAaAaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Введите команду или ' выход ':
Я действительно не понимаю, что здесь происходит, но я думаю, что это, вероятно, из-за неправильного использования pyserial модуля. Я уже пытался использовать команду inWaiting() для чтения только байтов, содержащихся во входном буфере, но эта функция всегда возвращает ноль, и команда readline(), похоже, не работает, поэтому я просто читаю пакеты размером 1024 байта.
Вот код, который я написал до сих пор:
import serial, time, os
def sendAtCommand(command):
# responseArray = []
# i = 0
try:
# print('Number of bytes waiting in input buffer before write : '+str(ser.inWaiting())) -> always zero...
if ser.inWaiting():
# flush input buffer, discarding all its contents
print('flushing input buffer ...')
ser.flushInput()
# flush output buffer, aborting current output
# ser.flushOutput()
try:
ser.write(command.encode('ascii')+'\r')
#ser.write(command+'\r')
#time.sleep(5)
except SerialTimeoutException as e:
print(repr(e))
response = ser.read(size=1024)
# print('Number of bytes waiting in input buffer after write : '+str(ser.inWaiting())) -> always zero
# while ser.inWaiting():
# print('Reading response ... '+str(i))
# responseArray.append(ser.readline(eol='\r\n'))
# i += 1
# time.sleep(0.2)
print('------------------------------------')
print('------------- Response -------------')
print('------------------------------------')
print(response)
# for line in responseArray:
# print(line)
print('------------------------------------')
time.sleep(1)
except KeyboardInterrupt as e:
print('Closing serial '+port+' before interrupting ...')
ser.close()
exit()
VERSION = '0.02'
firstStart = True
port = '/dev/ttyS2'
baudrate = 19200
bytesize = 8
parity = 'N'
stopbits = 1
timeout = 1
xonxoff = False
rtscts = False
dsrdtr = False
write_timeout = None
inter_byte_timeout = None
try:
os.system('cls' if os.name == 'nt' else 'clear')
print('')
print('PySerial version : '+serial.VERSION)
firstStart = False
print('')
print('Opening serial '+port+' ...')
ser = serial.Serial(port, baudrate, bytesize, parity, stopbits, timeout,
xonxoff, rtscts, write_timeout, dsrdtr, inter_byte_timeout)
except ValueError as e:
print(repr(e))
except SerialException as e:
print(repr(e))
if ser.isOpen():
print(ser.name + ' is open...')
print('')
while True:
try:
cmd = raw_input('Enter command or \'exit\' : ')
if cmd == 'exit':
ser.close()
exit()
else:
sendAtCommand(cmd)
except KeyboardInterrupt as e:
print('Closing serial '+port+' before interrupting ...')
ser.close()
exit()
Вы пробовали управления устройством с помощью последовательного порта терминала как minicom (или экран), чтобы отправлять команды, набирая их напрямую, и непосредственно показывать ответы устройства zignee? Это поможет решить, является ли проблема вашей программой, настройкой последовательного порта или устройством (или комбинацией). – barny
Более подробно см., Например, http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh – barny
Похож на битрейт и/или стоп-бит-матчи. – Olaf