通过pyserial发送十六进制(Modbus数据包)时出错

1 投票
1 回答
5515 浏览
提问于 2025-04-17 20:07

我在用Python和pyserial给一个串口设备(电压传感器)发送一些十六进制代码,代码是0x01 0x03 0x00 0x00 0x00 0x01 0x0a 0x84。这个设备会返回一个当前电压的整数值。我的代码如下:

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似乎把每个字节都当成一个单独的数据包发送,下面的图片是从串口监视器上看到的情况。

可以查看这张图片:http://www.centralinfo.com.au/images/SerialOutput.png

前面8个字节(00 - 07)是来自Python应用程序的(注意不同数据包的颜色交替),接下来的8个字节(08 - 0f)是一个VB.net应用程序发送的相同数据,这个是可以正常工作的。

我的问题是,如何才能把上面这8个十六进制字节一起发送成一个数据包(按照Modbus协议),就像VB.net应用程序那样?

这里是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

谢谢你的时间!

克里斯

1 个回答

1

你的VB应用程序开启了XON/XOFF协议,而你的Python应用程序没有。如果没有开启XON/XOFF,我猜测你的Python应用程序在发送每个字节之间会等待一段时间,这样接收设备就会把每个字节当作一个独立的“数据包”来看待。

撰写回答