【问题标题】:Problem reading RS485 communication packets with raspberry pi using python使用python使用树莓派读取RS485通信数据包时出现问题
【发布时间】: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