使用python读取raspberry pi的RS485通信数据包时出现问题

使用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

在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(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'