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

时间:2018-10-03 00:51:48

标签: python ubuntu modbus rs485

问题是通过USB到rs485与Modbus设备通信。

所以我正在使用一些python 3.5,并且正在使用PyModbus,PySerial

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

当我在运行Ubuntu mate 16.04.5 LTS的Raspberry Pi3上运行代码时,设备没有响应我的代码。 我首先以为适配器未正确安装,但在仔细检查了所有内容之后, 我安装了gtkterm并将端口配置为/ dev / ttyUSB0 9600 8-n-2,并尝试将十六进制数据发送到Modbus,但仍然没有回复 然后我注意到在流控制下它具有RS485-HalfDuplex(RTS)设置,并且在高级选项下,如果我将发送延迟设置为20毫秒和10 ms RTS关闭

现在,当我尝试发送十六进制模式数据包时,设备将按预期进行响应。

我连接了我的示波器,并从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信号之前增加了睡眠时间,也没什么区别。

1 个答案:

答案 0 :(得分:0)

在安装侦听器并让gtkterm使用虚拟端口后,确定了错误消息,因为侦听器不支持RTS和DTR,但是由于某种原因,它仍然能够与Modbus设备通信, >

然后,我将python代码指向了可拦截虚拟端口,并且正在传输与gtkterm相同的信息,但是没有响应,但是我发现写入数据的速度更快

然后我将代码更改为一次只发送1个字节,并且它们之间的延迟为10ms,然后突然开始工作。

因此带有pyModbus https://pymodbus.readthedocs.io/en/latest/的示例代码 我编辑了client / sync.py

增加了2个额外的进口

import time
import struct

并稍微更改了ModbusSerialClient的_send函数

来自

size = self.socket.write(request)

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