pyserial 2.7,python 3.3,发送回车

时间:2014-03-22 05:50:43

标签: python serial-port embedded raspberry-pi

我一直在尝试使用UART接口与嵌入式电路建立Raspberry Pi接口。 Pi上的UART接口处于工作状态,我可以从电路接收消息,但是我在向电路发送消息时遇到了麻烦。

我使用Python 3.3和Pyserial 2.7。示例代码可用,但它使用Pyserial 2.6。当与旧版本的Python(< 2.6)一起使用时,ser.write()接受字符串,但现在它只接受字节数组。

我遇到的问题是发送回车...旧的代码据说只用:

ser.write("L1\r")

但现在我使用以下内容:

ser.write(bytearray("L1\r", "ascii"))

电路不响应命令。我认为结果消息是将\r作为两个单独的字符而不是回车符发送。我如何确保我的代码输出附加回车符的命令?

注意:我可以合理地预期电路工作正常并且Pi的UART接口正常工作。该电路是Atlas Scientific溶解氧电路。该电路的文档要求命令以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

  3. 提前致谢!

    编辑: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
    )
    

    这个端口声明是根据电路的数据表完成的(遗憾的是我只能发布两个链接:(谷歌很容易提起)。

2 个答案:

答案 0 :(得分:2)

我找到了解决方案!!不幸的是,我无法解释它是如何工作的。也许读这篇文章的人可以详细说明并给出正确的解释!

该电路的文档要求命令采用CMD<CR>形式。实际上,制造商提供的示例代码通过pyserial将L1命令发送为ser.write("L1\r")

现在ser.write()需要字节,但是我发现ser.write(b'L1\r')不起作用。虽然电路在某种程度上是未知的,但收到了命令。

经过一段时间的玩耍后,我发现ser.write(b'\rL1\r')有效!在处理命令之前,调试指示灯闪烁红色一次。好像我只需要发送一个虚拟命令&#39;得到电路的关注!

我不确定这是不是pyserial,电路或我自己的无知。如果有人能够对此有所了解,我们将不胜感激! :d

如果有兴趣的话,我已将电路文档链接到此处。 https://www.atlas-scientific.com/_files/_datasheets/_circuit/DO_Circuit_5.0.pdf

答案 1 :(得分:2)

[编辑]对于未来的观众,我只想指出,对于较新的EZO版本的电路,命令是&#34; L,1&#34;或者真的&#34; L,1 \ r&#34;  [/编辑]

这是电路的一个已知问题。上电后的第一次读取将失败。而不是在每次读取时都使用\ r \ n前置,只需发送包含\ r的bogus命令,然后重置输入缓冲区

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() won't take my string

  

当EZO™级电路处于UART模式时,为其加电   发送给它的第一个命令将作为错误返回。这是因为   UART缓冲区将显示它在期间收到了一个字符   充电。只需将空白字符发送到pH电路即可   通电后,这将清除缓冲区。