2

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

这是我的代码:

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

4 回答 4

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,则必须添加超时。

于 2015-04-15T02:37:36.733 回答
1

为了阅读,您需要先打开一个监听端口(有超时),例如:

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()

在此处查看更多详细信息。

于 2013-05-22T21:06:38.547 回答
1

您的设备可能没有以换行符终止其响应。.readline() 方法需要一个换行符终止的字符串。请参阅此处:http ://pyserial.sourceforge.net/shortintro.html#readline 了解更多信息。

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

ser.timeout = 10

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

于 2013-05-22T21:06:59.247 回答
0

这里有两个重要的想法。第一个是超时,第二个是 EOL 字符。如果您要在接收器端使用超时,那么发送器端不需要 EOL。如果您要在发送端(/n,/r)使用 EOL 字符,则无需在接收端设置时间。例如:serialport=serial.serial(port,baud,timeout) 如果您要使用超时输入信号通过串行端口(例如:你好,你好吗?很高兴见到你!!)这里新行 cherector 没有响应好吧。所以你可以离开它。

例如:serialport=Serial.serial(port,baud) 如果您不打算在串口中设置超时,那么您应该在发送器中使用行尾字符 (/n,/r) 注意:第二种方式比第一种方式

于 2019-03-14T10:42:51.883 回答