Python 通过pyserial发送hex(Modbus数据包)故障

Python 通过pyserial发送hex(Modbus数据包)故障,python,serial-port,pyserial,modbus,Python,Serial Port,Pyserial,Modbus,我在将以下十六进制代码0x01 0x03 0x00 0x00 0x00 0x00 0x01 0x0a 0x84发送到串行设备(电压传感器)时遇到一些问题,该设备将使用Python和pyserial返回当前电压的int。我的代码如下: import serial import time ser = serial.Serial( port=1, baudrate=38400, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_TWO, byte

我在将以下十六进制代码0x01 0x03 0x00 0x00 0x00 0x00 0x01 0x0a 0x84发送到串行设备(电压传感器)时遇到一些问题,该设备将使用Python和pyserial返回当前电压的int。我的代码如下:

import serial
import time

ser = serial.Serial(
port=1,
baudrate=38400,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.EIGHTBITS,
timeout=0,
xonxoff=0,
rtscts=0)    

ByteStringToSend = "\x01\x03\x00\x00\x00\x01\x0a\x84"
ser.write(ByteStringToSend)
time.sleep(1)
RecievedData = ""
while ser.inWaiting() > 0:
    RecievedData = ser.read(1)
return RecievedData
问题在于Python似乎将每个字节作为单独的数据包从串行监视器发送,请参见下图

请参见图片中的

前8个字节(00-07)来自python应用程序(请注意不同数据包的altinate颜色),接下来的8个字节(08-0f)是一个VB.net应用程序,它发送相同的数据

我的问题是如何发送上面的8个十六进制字节,以便按照vb.net应用程序将其保存在一个数据包(Modbus协议)中

用于比较的VB代码:

     ' open the serial port if it is closed
            If Me.SerialPort1.IsOpen = False Then
                Me.SerialPort1.PortName = ComPort
                Me.SerialPort1.BaudRate = "38400" 'Set Baud rate
                Me.SerialPort1.RtsEnable = False ' Set RTS
                Me.SerialPort1.DtrEnable = False ' Set DTR
                Me.SerialPort1.Parity = IO.Ports.Parity.None
                Me.SerialPort1.StopBits = IO.Ports.StopBits.Two
                Me.SerialPort1.DataBits = 8 ' Set data length
                Me.SerialPort1.Handshake = Handshake.XOnXOff
                Me.SerialPort1.ReadTimeout = 10000
                Me.SerialPort1.WriteTimeout = 10000
                Me.SerialPort1.Open()
            End If

    Try
            Dim CommandBlock(7) As Byte
            CommandBlock(0) = &H1
            CommandBlock(1) = &H3
            CommandBlock(2) = &H0
            CommandBlock(3) = &H0
            CommandBlock(4) = &H0
            CommandBlock(5) = &H1
            CommandBlock(6) = &HA
            CommandBlock(7) = &H84
            Me.SerialPort1.Write(CommandBlock, 0, CommandBlock.Length)
            Thread.Sleep(100)
            Return True
        Catch ex As Exception
            Return False
        End Try
提前感谢您抽出时间
Chris

您的VB应用程序启用XON/XOFF协议,而python应用程序不启用。如果未启用XON/XOFF,我怀疑您的python应用程序在发送之前在每个字节之间等待一定时间,因此接收设备将每个字节视为一个单独的“数据包”。

您的VB应用程序启用XON/XOFF协议,而您的python应用程序不启用。如果未启用XON/XOFF,我怀疑您的python应用程序在发送前在每个字节之间等待一定时间,因此接收设备会将每个字节视为一个单独的“数据包”。

没有串行“数据包”这样的东西。您正在使用的软件是什么,它告诉您这些数据包是单独发送的?另外,您没有发送“hex”。在源代码中编写十六进制并不意味着发送“十六进制”。您正在发送二进制数据。如果您发送的是十六进制,则意味着您发送的是这些字节的十六进制表示形式的ASCII字符。您好,感谢您的回复,监控软件是Device monitoring Studio-原始数据视图。当使用VB应用程序时,所有8个字节都会突然出现在一个块中,然后设备会回复。但是python代码在发送时一次显示一个字节,这意味着当请求发送时,一个字节按顺序显示(大约相隔100-200毫秒),与和重复?谢谢,我现在就检查它,没有串行“数据包”这样的东西。您正在使用的软件是什么,它告诉您这些数据包是单独发送的?另外,您没有发送“hex”。在源代码中编写十六进制并不意味着发送“十六进制”。您正在发送二进制数据。如果您发送的是十六进制,则意味着您发送的是这些字节的十六进制表示形式的ASCII字符。您好,感谢您的回复,监控软件是Device monitoring Studio-原始数据视图。当使用VB应用程序时,所有8个字节都会突然出现在一个块中,然后设备会回复。但是python代码在发送时一次显示一个字节,这意味着当请求发送时,一个字节按顺序显示(相隔约100-200毫秒)与和的重复?谢谢,我现在将检查它。我将尝试一下,并让您知道:DI已更改了以下行(xonxoff=1),不幸的是,它给出了相同的结果,如果它一次出现一个字节,显示为多个数据包,那么我将尝试一下,并让您知道:DI已经更改了下面的行(xonxoff=1),不幸的是,它给出了相同的结果,即它一次出现一个字节,显示为多个数据包