簡體   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