[英]pyserial 2.7, python 3.3, sending carriage returns
我一直在尝试使用带有UART接口的带有嵌入式电路的Raspberry Pi接口。 Pi上的UART接口工作正常,尽管我无法向电路发送消息,但我可以从电路接收消息。
我在Pyserial 2.7中使用Python 3.3。 可以使用示例代码,尽管它使用Pyserial 2.6。 当与旧版本的Python(<2.6)一起使用时, ser.write()
接受字符串,但现在仅接受ser.write()
。
我遇到的问题是发送回车符...原来的代码只能运行:
ser.write("L1\\r")
但现在我正在使用以下内容:
ser.write(bytearray("L1\\r", "ascii"))
电路不响应该命令。 我认为结果消息将\\r
作为两个单独的字符而不是回车符发送。 我如何确定我的代码输出的是带有回车符的命令?
注意:我可以合理地预期电路工作正常并且Pi的UART接口可以正常工作。 该回路是阿特拉斯科学溶解氧回路。 电路的文档要求以l1<cr>
或L1<CR>
的形式编写命令。
相关链接:
旧的示例代码( https://www.atlas-scientific.com/_files/code/pi_sample_code.pdf )
描述写入方法的文档( http://pyserial.sourceforge.net/pyserial_api.html#classes )
提前致谢!
编辑:Netch提出了一个强项: ser.write(b'L1\\r')
可以工作并且更干净。 但是,这两种方法都在发送正确的'\\ r'序列。问题是电路仍然没有将L1\\r
视为有效命令。 在这一点上,我认为我的问题可能是串行端口的某些属性。
我的端口被声明为:
ser = serial.Serial(
port = '/dev/ttyAMA0',
baudrate = 38400,
bytesize = serial.EIGHTBITS,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
timeout = 1
)
该端口声明是根据电路的数据表完成的(不幸的是,我只能发布两个链接:(Google轻松将其提起)。
我找到了解决方案! 不幸的是,我无法解释它是如何工作的。 也许任何阅读此书的人都可以对此进行详细阐述并给出适当的解释!
电路的文档要求命令采用CMD<CR>
的形式。 实际上,制造商提供的示例代码通过pyserial将L1
命令发送为ser.write("L1\\r")
。
现在, ser.write()
需要字节,我发现ser.write(b'L1\\r')
不起作用。尽管电路不知如何,但仍接收到该命令。
ser.write(b'\\rL1\\r')
了一段时间后,我发现ser.write(b'\\rL1\\r')
可以工作了! 在执行命令之前,调试指示灯将闪烁红色一次。 看来我只需要发送“虚拟命令”即可引起电路注意!
我不确定这是否是脓疱,电路或我自己的无知。 如果有人可以对此有所了解,将不胜感激! :D
如果有人有兴趣,我已经在这里链接了电路文档。 https://www.atlas-scientific.com/_files/_datasheets/_circuit/DO_Circuit_5.0.pdf
[编辑]对于将来的观众,我只想指出,对于较新的EZO版本的电路,命令为“ L,1”或实际上为“ L,1 \\ r” [/ EDIT]
这是电路的已知问题。 上电后的第一个读取将失败。 而不是每次读取都在前面加上\\ r,只需发送包含\\ r的伪指令,然后重置输入缓冲区
ser.write('bogus\r'.encode()) # EDIT: had to add .encode() to get it to work. see https://stackoverflow.com/questions/22275079/pyserial-write-wont-take-my-string
ser.flushInput() # or for pyserial 3+ ser.reset_input_buffer()
#now do your thing
编辑:必须添加.encode()使其工作。 看到pySerial write()不会接受我的字符串
在处于UART模式的EZO™类电路上电后,发送给它的第一个命令将作为错误返回。 这是因为UART缓冲区将显示它在上电期间已收到一个字符。 通电后,只需将空白字符发送到pH电路,这将清除缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.