所以我想发送这个代码:01 00 14 00 58
通过ModBus RTU利用minimalmodbus到我的虚拟COM端口(COM2)。
所以我得到了"code"但是我也在代码之前和之后得到其他字节,我似乎可以知道它们来自哪里以及如何解决它。
终端输出图像
我确实尝试使用另一个名为pymodbus的库,但我得到了相同的结果
PythonCode:
import serial
import minimalmodbus as mrtu
mrtu.BYTEORDER_BIG = 1
insmrt = mrtu.Instrument('COM2',1 ,mrtu.MODE_RTU,close_port_after_each_call= False,debug=True)
insmrt.precalculate_read_size= False
insmrt.clear_buffers_before_each_transaction= True
insmrt.serial.baudrate = 38400
insmrt.serial.bytesize = 8
insmrt.serial.parity = serial.PARITY_NONE
insmrt.serial.stopbits =1
insmrt.serial.timeout = 5
insmrt.handle_local_echo = None
def inscommmand():
#insmrt.write_string = "$0100140058"
insmrt.write_registers(0,[0x01,0x14,0x58])
while 1:
try:
inscommmand()
except:
continue
我真的不知道你想做什么或者你的意思是什么发送这个代码Modbus但是我担心什么库(minimalModbus)正在做的正是它应该做的。
如果你调用:
insmrt.write_registers(0,[0x01,0x14,0x58])
库将构建以下Modbus框架:
01 10 0000 0003 06 0001 0014 0058 9ABE
这是这一帧中每个值的含义:
01
: Slave Address(默认为地址1)
10
:函数码16(写多个保持寄存器,16 = 10十六进制)
0000
:第一个寄存器的地址(0000 hex = 0, +40001 offset = register #40001)。
0003
:由于您正在给出一个3元素列表,因此要写入的寄存器数
06
:后面的数据字节数(3个寄存器x每个寄存器2字节= 6字节)。
0001
:值写入寄存器40001
0014
:写入寄存器40002的值
0058
:写入寄存器40003的值
9ABE
:用于错误检查的CRC(循环冗余校验)。
序列01 00 14 00 58
不是一个有效的Modbus帧,因为没有功能码00
(只允许取值为1 ~ 6、15和16)。
也许你想要的只是通过串行端口发送该序列?否则,您应该考虑这些值是从哪里来的。