ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – 串口未正确刷新

2019-05-22 21:48:43  阅读:346  来源: 互联网

标签:linux python-3-x raspberry-pi pyserial


我有一个RPi(是的,我知道,也许有人认为这属于RPi网站,但我认为它与Linux有关,所以StackOverflow是正确的地方)我正在使用Python3通过MAX485在一些Arduinos之间进行通信这或多或少都有效,因为我发现我需要做一些奇怪的解决方法才能让一切工作“正常”.

如果我发送数据:

GPIO.output(23, 1) # Pulling transmit pin high to send
comport.write("Some data".encode()) # Writing data
comport.flush() # Flushing the buffer
GPIO.output(23, 0) # Pulling pin down to receive

Arduino接收数据并立即响应,但由于pySerial尚未准备就绪,它变得什么都没有,我们丢失了数据包.

但是,如果我这样尝试:

GPIO.output(23, 1)
comport.write("Some data".encode())
time.sleep(.001) # Add some delay of only 1ms
comport.flush()
GPIO.output(23, 0)

然后数据被发送并被接收.这引出了一个问题:flush命令是否正常工作?我试了一下:

GPIO.output(23, 1)
comport.write("Some data".encode())
time.sleep(.001) # Add some delay
# -- No flush --
GPIO.output(23, 0)

令人惊讶的是它也有效.似乎睡眠“替换”了flush命令.

为什么pySerial的缓冲区没有刷新?我知道,这可能是一种方法,但是睡眠只会增加一个(通常)不必要的代码,导致整个代码等待(超过500行),这并不是那么好.

我已经在互联网上搜索了一些,并且有人说它是不支持刷新的USB TTL适配器(这里不是这种情况,这个是板载的),其他人说它可能是Linux内核错误,所以没有什么真正有意义的对我来说.

如果有人能够解释为什么flush命令不起作用以及如何使它工作(如果有办法),我和这个问题的每个未来访问者都会非常高兴.

解决方法:

您并不具体,但我认为假设您在半双工模式下使用MAX485是公平的.如果是这种情况,那么您尝试做的将无法可靠地运行.

问题是什么?

半双工通信使用same pair of wires在任一方向上传输.但是一次只能传输一端.因此,这需要某种方式来协调当前正在传输的人.

enter image description here

我相信你对这个问题有一个很好的总结:

the Arduino receives the data and responds imediately, but because pySerial is somehow not ready yet, it becomes nothing back and there we have a lost packet.

然而,没有准备好的PySerial,它是你的MAX485,以及GPIO-23的状态.

一切都在时机

这张照片来自于Moxa在Half Duplex 485上的优秀技术说明,标题为The Secrets of RS-485 Half-duplex Communication

enter image description here

此图显示您需要在恰当的时刻更改GPIO-23(此图中的MASTER-RTS)的状态,否则您的通信将失败.技术说明值得全面阅读,我相信很好地描述了您所面临的挑战.

我如何解决它?

答案是,这取决于.您的问题可能是过早或过晚切换GPIO-23.如果可能的话,最简单但性能最差的方法是让你的Arduino等待一段时间才能响应.这将允许你睡眠()以确保你的数据包已经完成传输,然后在Arduino开始响应之前切换GPIO-23的状态.

如果此解决方案不可行或不可取,那么您需要研究驱动GPIO-23的其他方法.在SW中还有很多其他方法可以做到这一点,有些方法比其他方法更好.但请注意,只使用python代码切换GPIO-23线路,这绝不会100%可靠.如果需要高可靠性,几乎肯定需要某种硬件辅助.

最后要注意的是,除非需要RS-485,否则您可以考虑使用全双工,使用RS-422,甚至是RS-232.

标签:linux,python-3-x,raspberry-pi,pyserial
来源: https://codeday.me/bug/20190522/1154223.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有