繁体   English   中英

pyserial 2.7,python 3.3,发送回车

[英]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>的形式编写命令。

相关链接:

  1. 旧的示例代码( https://www.atlas-scientific.com/_files/code/pi_sample_code.pdf

  2. 描述写入方法的文档( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM