2013-05-22 6 views
2

Мне нужно отправить ZANE:1:00004:XX_X.X_XXXX_000XX:\r\n через последовательную связь с python.python и serial. как отправить сообщение и получить ответ

вот мой код:

import serial 
ser = serial.Serial('/dev/cu.usbserial-A901HOQC') 
ser.baudrate = 57600 

msg = 'ZANE:1:00004:XX_X.X_XXXX_000XX:\r\n' 

Если я пишу:

>>> ser.write(msg) 

ответ будет 33, который является длиной в байтах сообщения я представляемый.

Как я могу получить ответ? Подключенное устройство будет отвечать только после того, как он получает сообщение, но если я печатаю

>>> ser.write(msg); ser.readline() 

результат будет, что readline никогда не получает никакого сообщения на всех ...

какие-либо идеи?

ответ

0

Для того, чтобы прочитать вам нужно открыть порт прослушивания (с прерыванием) первой, например:

ser = serial.Serial('/dev/cu.usbserial-A901HOQC', 19200, timeout=5) 
x = ser.read()   # read one byte 
s = ser.read(10)  # read up to ten bytes (timeout) 
line = ser.readline() # read a '\n' terminated line 
ser.close() 

Смотреть подробнее here.

0

Возможно, ваше устройство не завершает свой ответ символом новой строки. Метод .readline() ожидает строку с завершающим символом новой строки. См. Здесь: http://pyserial.sourceforge.net/shortintro.html#readline для получения дополнительной информации.

попробуйте установить тайм-аут на вашем последовательном соединении

ser.timeout = 10 

и заменить ser.readline() с ser.read (п), где п есть число символов, которые вы хотите прочитать. ser.read (100) попытается прочитать 100 символов. Если 100 символов не появятся в течение 10 секунд, он откажется и вернет все, что получил.

1

Я считаю, что более ранние ответы не понимали, что вы используете один и тот же порт для записи и чтения.

У меня такая же проблема и она была решена с использованием функции сна. В основном:

import serial 
from time import sleep 
ser = serial.Serial('/dev/cu.usbserial-A901HOQC', timeout=1) 
ser.baudrate = 57600 

msg = 'ZANE:1:00004:XX_X.X_XXXX_000XX:\r\n' 
ser.write(msg) 
sleep(0.5) 
ser.readline() 

Так что с этим сном вы даете время на приемник (машину?), Чтобы отправить ответ. Также обратите внимание, что вы должны добавить таймаут, если хотите использовать readline.

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