Ubuntu mate Python使用PySerial通过RS485半双工传输问题

2024-05-13 03:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

通过USB到rs485与Modbus设备通信时出现问题。在

所以我使用了一些python3.5和PyModbus,PySerial

我的代码是基于PyModbus的串行示例,在windows下它可以正常工作,并且可以正确地与Modbus设备通信

当我在运行ubuntumate 16.04.5lts的Raspberry Pi3上运行代码时,设备没有响应我的代码。 我一开始以为适配器没有正确安装,但是在仔细检查了所有东西之后, 我安装了gtkterm并将端口配置为/dev/ttyUSB0 9600 8-n-2,并尝试将十六进制数据发送到Modbus,但仍然没有响应 然后我注意到在流量控制下它有一个RS485半双工(RTS)设置,在高级选项下,如果我将发送延迟设置为20毫秒和10毫秒RTS关闭

现在当我尝试发送hex modus包时,设备会按预期响应。在

我连接了我的示波器,从python代码开始,它正在随机传输一些小数据包,看起来更像是在超时后发送数据。 经过一点挖掘,似乎有些USB到rs485设备需要RTS将设备切换到传输模式,然后关闭RTS以将其恢复到接收模式。在

我还发现pySerial有一个RS485设置,并尝试了这些设置,然后被传输的数据包比gtkterm更规则、更大,但仍然比gtkterm短得多,而且很多时间上的混乱也帮了我一把,我现在又回到了使用原始代码,但是

socket.setRTS(1)  
time.sleep(0.02)
socket.write(request)
time,sleep(0.1)
socket.setRTS(0)

似乎给出了示波器上采集到的最长数据包,但该数据包的长度为8.42ms,而gtkterm的数据包为9.36ms,在两条消息的轨迹之间扫一眼,似乎数据包的末尾丢失了。但即使我在关闭RTS信号前增加睡眠时间也没什么区别。在


Tags: 代码时间模式socket数据包modbuspymodbususb
1条回答
网友
1楼 · 发布于 2024-05-13 03:27:50

好吧,在安装了intercepty并让gtkterm使用虚拟端口后,它发出了一声错误消息,因为intercepty不支持RTS和DTR,但由于某些原因它仍然能够与modbus设备通信

然后,我将python代码指向intercepty虚拟端口,我正在传输与gtkterm相同的信息,但没有响应,但我注意到我写数据的速度快得多

所以我把代码改为每次只发送1个字节,它们之间有10毫秒的延迟,然后它突然开始工作了。在

从pyModbus https://pymodbus.readthedocs.io/en/latest/得到的示例代码 我编辑了客户/同步.py在

增加2个额外进口

import time
import struct

并对ModbusSerialClient的发送函数做了一些改动

^{pr2}$

        size=0
        for item in request:
            size = self.socket.write(struct.pack(">B",item))
            time.sleep(0.01)
        size=len(request)

相关问题 更多 >