使用python读取raspberry pi的RS485通信数据包时出现问题
在modbus协议中,我无法通过串行线路读取数据包。我想从使用RS485通信的温度计中读取温度,因此我将树莓pi与waveshare RS485 can hat结合使用 下面是一个代码示例使用python读取raspberry pi的RS485通信数据包时出现问题,python,raspberry-pi,serial-port,modbus,Python,Raspberry Pi,Serial Port,Modbus,在modbus协议中,我无法通过串行线路读取数据包。我想从使用RS485通信的温度计中读取温度,因此我将树莓pi与waveshare RS485 can hat结合使用 下面是一个代码示例 #!/usr/bin/python3 import RPi.GPIO as GPIO import serial import time from prectime import processor_sleep rsp = 4 GPIO.setwarnings(False) GPIO.setmode
#!/usr/bin/python3
import RPi.GPIO as GPIO
import serial
import time
from prectime import processor_sleep
rsp = 4
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(rsp, GPIO.OUT)
GPIO.output(rsp, 0)
a = float(7.5)
command = [0x02,0x04,0x00,0x05,0x00,0x01,0x21,0xF8]
r = str(0)
ser = serial.Serial('/dev/ttyS0', 9600, timeout = 0.1)
while len(str(r)) < 31:
GPIO.output(rsp, 1)
ser.write(command)
processor_sleep(a)
GPIO.output(rsp, 0)
r = ser.readline()
print(r,' --- ',a)
a = a + 0.1
processor_sleep(1000)
ser.close()
它应该看起来像(从嗅探器)
我不知道发生了什么事,有时我会很好地抓住包裹,但这很少见
提前感谢。这个话题已经被详细讨论过了 只要按照我答案中的兔子洞链接就行了。你应该能够解决你的问题 我会选择libmodbus解决方案(也有一个Python包装器),但如果您愿意,也可以使用pymodbus
不管怎么说,锯末在评论中说的话也是很好的建议。最简单的方法是投资10美元,买一个能够自动切换的收发器。不幸的是,您的不是。我不使用/了解Python,但使用
ser.readline()
检索看起来像二进制数据的内容(而不是一行ASCII文本)可能是不正确的。此外,写入后休眠然后翻转GPIO可能会有问题,因为用户空间与设备I/O不同步。如果传输到接收模式之间的转换延迟,则可能会丢失输入。过早切换,变速箱将被切断。通常RS-485利用硬件执行这种模式转换。但我不知道如何在传输和接收之间启用硬件转换。您的设备不支持硬件RX/TX切换。请看我的答案。为什么不使用Pymobdus尝试同样的方法呢?它可能会使您的输出更容易理解,从而更易于调试
import time
def processor_sleep(ms):
_ = time.perf_counter() + ms/1000
while time.perf_counter() < _:
pass
b'' --- 7.5
b'' --- 7.6
b'' --- 7.699999999999999
b'\x02\x04\x02\x01S\xbc\x9d' --- 7.799999999999999
b'\x02\x04\x02\x01S\xbc\x9d' --- 7.899999999999999
b'\x02\x04\x02\x01S\xbc\x9d' --- 7.999999999999998
b'\x02\x04\x02\x01S\xbc\x9d' --- 8.099999999999998
b'\x02\x04\x02\x01\x52\xbc\x9d'