首页 > 解决方案 > Python 睡眠功能问题或 os.system 执行树莓派 4 的时间过长

问题描述

我正在尝试使用 Raspberry Pi 4 与 RS485 芯片进行通信以进行串行通信。我需要使用 Pi 的 GPIO#3 来控制 RS485 芯片上的 nRE/DE PIN。当 GPIO#3 为低电平时,RS485 芯片处于 Rx(读取)模式,高电平处于 Tx(发送)模式。要传输任何内容,我需要在发送任何数据之前将 GPIO#3 设置为 HIGH(这部分有效),并且理想情况下 GPIO#3 应该在与写入过程相同的持续时间内为 HIGH。所以我做了以下事情:

os.system("echo 1 > /sys/class/gpio/gpio3/value") #set GPIO#3 HIGH
n = ser.write(cmdHex)
os.system("echo 0 > /sys/class/gpio/gpio3/value") #set GPIO#3 LOW
#the rest of the code is read response back from the target device

但是,这种代码结构不起作用。我连接了示波器,它显示 GPIO#3 设置为 HIGH 的时间很短(几乎可以看到长度),并在数据发送通过时立即变为 LOW。假设整个数据需要 8ms 发送出去,GPIO#3 仅设置为 HIGH 0.2ms。看到这种行为后,我决定添加睡眠功能,让程序等到写入完成,然后将 GPHI#3 设置为 LOW。并且可以根据波特率计算写入过程的持续时间。

#each byte has 1 start bit, 8 data bit and 1 stop bit, so 10 bits total
sleeptime = 1/(baudrate*1.0) * dataLength * 10 
os.system("echo 1 > /sys/class/gpio/gpio3/value") #set GPIO#3 HIGH
n = ser.write(cmdHex)
time.sleep(sleeptime)
os.system("echo 0 > /sys/class/gpio/gpio3/value") #set GPIO#3 LOW
#the rest of the code is for reading

然而,真正的问题来了。它不会在这段时间内完全睡觉。它总是睡得更久(有时长一点,有时很长,很不一致)。这种意外行为导致有时 GPIO#3 引脚停留时间过长并且与响应重叠,因此芯片无法读取它,因为它仍处于写入模式...

任何帮助如何解决这个问题?我完全不知道我做错了什么。

感谢您在下面的任何想法/评论。

标签: pythonraspberry-pi4rs485

解决方案


推荐阅读