繁体   English   中英

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

[英]Ubuntu mate Python using PySerial via RS485 half duplex transmit problems

通过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信号之前增加了睡眠时间,也没有什么区别。

在安装侦听器并让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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM