我正在编写一个 modbus 客户端来读取传感器。我有一个可以在 Windows 上正常工作的代码(具有多个波特率)。但是,在 Linux 上运行时,波特率不正确。我正在使用pymodbus==3.1.0
.
我尝试制作一个最小的工作示例,但波特率设置正确。此代码与设备代码之间的唯一区别是GuiProcess
运行 python tkiner gui,它允许选择设备。
from pymodbus.pdu import ModbusRequest
from pymodbus.client import ModbusSerialClient
from pymodbus.transaction import ModbusRtuFramer
from pymodbus.exceptions import ModbusIOException
import time
import multiprocessing
MODUBS_REGISTER_READ_BLOCK = 100
# Communication process
def COMProcess():
client = ModbusSerialClient(
method = 'rtu'
,port= "/dev/ttyS0"
,baudrate=19200
,parity = 'N'
,stopbits=1
,bytesize=8
,timeout=0.1
,RetryOnEmpty = True
,RetryOnInvalid = True
)
connection = client.connect()
time.sleep(2)
while(1):
rr = client.read_holding_registers(0 ,MODUBS_REGISTER_READ_BLOCK,slave=0x12)
time.sleep(1)
client.close()
# Communication process
def GuiProcess():
while(1):
time.sleep(1)
# In the real scenario a tkinter gui is running here
print("elapsed 1 sec")
# Start multiple thread, one for GUI and another for COM
p1 = multiprocessing.Process(target= COMProcess )
p2 = multiprocessing.Process(target= GuiProcess )
p1.start()
p2.start()
p1.join()
p2.join()
在真实设备中,如果我打印客户端信息,则它似乎配置正确。然而,消息以 9600 波特率物理发送(用示波器测量)。
ModbusSerialClient(<pymodbus.framer.rtu_framer.ModbusRtuFramer object at 0x7fc3749c6f20> baud[19200])
pymodbus
关于什么可能导致串行客户端和串行客户端之间出现这种类型的错位的任何想法/dev/ttyS0
以及如何强制特定的波特率?