我必须通过与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
永远不会得到任何消息......
任何想法?
答案 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) 注意:第二种方法比第一种方法更有效