gpt4 book ai didi

linux - 串行端口未正确刷新

转载 作者:IT王子 更新时间:2023-10-29 00:54:31 32 4
gpt4 key购买 nike

我有一个 RPi (是的,我知道,也许有人认为这属于 RPi 站点,但我认为它通常与 Linux 相关,所以 StackOverflow 是正确的地方) 并且我'我使用 Python3 和 pySerial 通过 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)

令人惊讶的是它也有效。似乎 sleep “取代”了 flush 命令。

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

我已经在网上搜索过了,有人说是 USB TTL Adapter 不支持 flushing(这里不是这种情况,这个是板载的),其他人说可能是 Linux 内核错误,所以对我来说没有任何意义。

如果有人可以解释为什么 flush 命令不起作用以及如何让它起作用(如果有办法的话),我和这个问题的 future 访问者可能会非常高兴。

最佳答案

您没有具体说明,但我认为假设您在半双工模式下使用 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 的一篇优秀技术说明中抄录的图片在半双工 485 上,标题为 The Secrets of RS-485 Half-duplex Communication

enter image description here

这张图片显示您需要在适当的时候更改 GPIO-23(这张图片中的 MASTER-RTS)的状态,否则您的通信将失败。该技术说明值得完整阅读,我相信很好地描述了您面临的挑战。

我该如何解决?

答案是,视情况而定。您的问题可能是太早或太晚切换 GPIO-23。如果可能,最简单但性能最低的方法是让您的 Arduino 在响应之前等待一段时间。这将允许您sleep() 一段时间以确保您的数据包已完成传输,然后在 Arduino 开始响应之前切换 GPIO-23 的状态。

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

最后一点,除非需要 RS-485,否则您可以考虑使用 RS-422 或什至 RS-232 的全双工。

关于linux - 串行端口未正确刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681253/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com