【问题标题】:Trouble send hex (Modbus Packet) via pyserial无法通过 pyserial 发送十六进制(Modbus 数据包)
【发布时间】:2013-03-25 21:16:26
【问题描述】:

我在将以下十六进制代码 0x01 0x03 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 似乎将每个字节作为单独的数据包发送,请参见下图来自串行监视器

查看图片http://www.centralinfo.com.au/images/SerialOutput.png

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

我的问题是如何根据 vb.net 应用程序发送上面的 8 个十六进制字节,使其位于一个数据包(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

提前感谢您的宝贵时间 克里斯

【问题讨论】:

  • 没有串行“数据包”这样的东西。您正在使用什么软件告诉您它们正在被单独发送数据包?
  • 另外,您没有发送“十六进制”。仅仅因为您在源代码中编写十六进制并不意味着您正在发送“十六进制”。您正在发送二进制数据。如果您发送的是十六进制,那意味着您发送的是这些字节的十六进制表示的 ASCII 字符。
  • 您好感谢您的回复,监控软件是 Device Monitoring Studio - 原始数据视图。使用 VB 应用程序时,所有 8 个字节都出现在一个突然的块中,然后从设备返回回复。但是发送时的python代码一次出现一个字节,这意味着发送请求时按顺序显示一个字节(大约相隔100-200毫秒)
  • 谢谢,我现在去看看

标签: python serial-port pyserial modbus


【解决方案1】:

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

【讨论】:

  • 很好,我会尝试一下并告诉你:D
  • 我更改了以下行 (xonxoff=1) 不幸的是它给出了相同的结果,它一次出现一个字节,显示为多个数据包
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多