python和serial。如何发送消息并收到答案

时间:2013-05-22 20:54:29

标签: python serial-port pyserial

我必须通过与python的串行通信发送ZANE:1:00004:XX_X.X_XXXX_000XX:\r\n

这是我的代码:

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永远不会得到任何消息......

任何想法?

4 个答案:

答案 0 :(得分:1)

您的设备可能没有使用换行符终止其响应。 .readline()方法期待换行符终止字符串。 见这里:http://pyserial.sourceforge.net/shortintro.html#readline 了解更多信息。

尝试在串行连接上设置超时

ser.timeout = 10

并用ser.read(n)替换ser.readline(),其中n是您希望读取的字符数。     ser.read(100) 将尝试读取100个字符。如果100个字符在10秒内没有到达,它将放弃并返回它收到的任何内容。

答案 1 :(得分: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,则必须添加超时。

答案 2 :(得分: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

答案 3 :(得分:0)

这里有两个想法很重要。第一个是超时,第二个是EOL角色。 如果您打算在接收器端使用超时,则无需从发送器端进行EOL。 如果要在发送器端(/ n,/ r)使用EOL charector,则无需在接收器端浪费时间。 例如:serialport = serial.serial(port,baud,timeout)(如果要使用超时) 通过串行端口传入的信号(例如:你好,你好吗!很高兴见到你!!)在这里,新的线路监控器无法很好地响应,因此可以将其保留。

例如:serialport = Serial.serial(port,baud)如果不打算在串行端口中超时,则应在发送器中使用行结束符(/ n,/ r) 注意:第二种方法比第一种方法更有效