【发布时间】:2023-04-02 21:00:02
【问题描述】:
我在 modbus 协议中通过串行线路读取数据包时遇到问题。我想从使用 RS485 通信的温度计读取温度,所以我将树莓派与 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(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()
我的带有processorsleep()函数的prectime库在这里。
import time
def processor_sleep(ms):
_ = time.perf_counter() + ms/1000
while time.perf_counter() < _:
pass
只要我将嗅探器并联到线路上,我就可以看到传感器正确接收并回答了初始数据包,但是,当我尝试通过 python 读取相同的答案时,结果是这样的:
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'
不知道是怎么回事,有时候碰巧抓包不错,不过很少见。
提前致谢。
【问题讨论】:
-
我不使用/不知道 Python,但使用
ser.readline()
检索看起来像二进制数据(而不是一行 ASCII 文本)可能是不正确的。此外,写入后休眠然后翻转 GPIO 可能会出现问题,因为用户空间与设备 I/O 不同步。如果传输模式到接收模式之间的转换延迟,您可能会面临丢失输入的风险。切换过早,然后传输被切断。通常 RS-485 使用硬件来执行这种模式转换。 -
但是我不知道如何启用发送和接收之间的硬件转换。
-
您的设备不支持硬件 RX/TX 切换。看我的回答。
-
为什么不尝试使用 Pymobdus,它可能使您的输出更易于理解,因此更易于调试
标签:
python
raspberry-pi
serial-port
modbus
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用python使用树莓派读取RS485通信数据包时出现问题 - Python技术站