gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:50:41 25 4
gpt4 key购买 nike

通过 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 毫秒 RTS 关闭,则在高级选项下

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

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

我还发现 pySerial 有一个 RS485 设置并尝试了这些设置,然后传输的数据包以前更规则和更大,但仍然比 gtkterm 短得多,而且很多时间弄乱有点帮助,我现在回到使用原始代码但放入

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

似乎给了我在示波器上拾取的最长数据包,但数据包的长度为 8.42 毫秒,而来自 gtkterm 的数据包为 9.36 毫秒,并且在两条消息的跟踪之间一目了然,似乎数据包的末尾丢失了。但即使我在关闭 RTS 信号之前增加 sleep 时间也没有什么区别。

最佳答案

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

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

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

所以使用 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)

关于python - Ubuntu mate Python 使用 PySerial 通过 RS485 半双工传输问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com