首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过RS485使用PySerial的Ubuntu mate Python半双工传输问题

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

Stack Overflow用户
提问于 2018-10-03 08:51:48
回答 1查看 602关注 0票数 1

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

所以我使用了一些Python3.5,并使用了PyModbus,PySerial

我的代码是基于PyModbus的串口示例,在windows下运行良好,并能正确地与Modbus设备通信。

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

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

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

我还发现pySerial有一个RS485设置,并尝试了这些设置,然后之前传输的包更规则、更大,但仍然比gtkterm短得多,而且在计时方面做了很多调整,现在我又回到了使用原始代码的地方,但输入了

代码语言:javascript
运行
复制
socket.setRTS(1)  
time.sleep(0.02)
socket.write(request)
time,sleep(0.1)
socket.setRTS(0)

似乎给了我在示波器上捕捉到的最长的包,但包是8.42ms长,只要gtkterm的包是9.36ms,在两个消息之间的痕迹一瞥,似乎包的末尾丢失了。但是,即使我在关闭RTS信号之前增加睡眠时间,也没有什么不同。

EN

回答 1

Stack Overflow用户

发布于 2018-10-03 21:56:15

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

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

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

因此,使用来自pyModbus https://pymodbus.readthedocs.io/en/latest/的示例代码,我编辑了client/sync.py

添加了2个额外的导入

代码语言:javascript
运行
复制
import time
import struct

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

从…

代码语言:javascript
运行
复制
size = self.socket.write(request)

代码语言:javascript
运行
复制
        size=0
        for item in request:
            size = self.socket.write(struct.pack(">B",item))
            time.sleep(0.01)
        size=len(request)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52618249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档