【发布时间】:2017-04-28 13:20:37
【问题描述】:
我有一个 RPi (是的,我知道,也许有人认为这属于 RPi 站点,但我认为它一般与 Linux 有关,所以 StackOverflow 是正确的地方) m 使用 Python3 和 pySerial 通过 MAX485 在一些 Arduino 之间进行通信。这或多或少有效,因为我发现我需要做一些奇怪的解决方法才能让一切“正常”工作。
如果我发送数据:
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 的缓冲区没有刷新?我知道,这可能是一种方法,但sleep 只会添加(通常)不必要的代码位,导致整个代码等待(超过 500 行),这不是很棒。
我已经在网上搜索了,有人说是 USB TTL Adapter 不支持flushing(这里不是这种情况,这个是板载的),其他人说可能是 Linux 内核错误,所以对我来说没有任何意义。
如果有人能解释为什么 flush 命令不起作用以及如何让它起作用(如果有办法的话),我和这个问题的每一位未来访客都会很高兴。
【问题讨论】:
-
运行的波特率是多少?您不清楚这里使用的是什么 GPIO23。
-
@StephenRauch
You are not clear what GPIO23 is being used for here.-> max485 芯片的传输引脚。
标签: linux python-3.x raspberry-pi pyserial