Vbnet 2017,第一次在modbus上拍摄

时间:2018-02-20 17:31:10

标签: serial-port modbus

我需要帮助读取带有modbus协议的串口 告诉我从芯片组读取HEX值,需要在阅读之前发送:

  

1E 03 00 0C 00 01 46 66 ..

回复示例是:

  

1E 03 02 xx yy ch cl

Imports System          'To Access Console.WriteLine()
Imports System.IO.Ports 'To Access the SerialPort Object
Module Module1

Sub Main()
    Console.WriteLine(ReceiveSerialData())
    Console.Read()
End Sub

Function ReceiveSerialData() As String
    'modbas
    ' Receive strings from a serial port.
    Dim returnStr As String = ""
    Dim com9 As IO.Ports.SerialPort = Nothing
    Try
        com9 = My.Computer.Ports.OpenSerialPort("COM9")
        com9.ReadTimeout = 5000
        com9.BaudRate = 19200
        com9.Parity = Parity.None
        com9.DataBits = 8
        com9.StopBits = StopBits.One
       ' com9.Write("1E 03 00 0C 00 01 46 66") ' stringa che serve per farsi rispondere dal chip, obbligo di inviarla
        ' com9.Read("1E 03 00 0C 00 01 46 66",0,8)
        Do
            Dim Incoming As String = com9.ReadLine()
            If Incoming Is Nothing Then
                Exit Do
            Else
                returnStr &= Incoming & vbCrLf
            End If
        Loop
    Catch ex As TimeoutException
        returnStr = "Error: Serial Port read timed out."
    Finally
        If com9 IsNot Nothing Then com9.Close()
    End Try
    Return returnStr
End Function

End Module

1 个答案:

答案 0 :(得分:0)

如果您使用的是Modbus RTU串行协议。如果你是,你不想写一个字符串,你想写原始字节,如:

byte[] request = new byte[]{1E,03,00,0C,00,01,46,66};
com9.Write(request, 0, request.Length);

您还需要读取原始字节。类似的东西:

byte [] response = new byte [256]; com9.Read(回复,0,7); //< - count(7)实际上取决于响应包

这不是最佳阅读方式,您可能会收到异常响应等,但它应该可以用于快速测试。

您确定您的COM设置是否正确?按照标准,你应该每个字节发送11位,所以:

1) Even/Odd/Mark parity bit
9600/19200 BAUD
8 data bits
1 Stop Bit

OR

2) No parity bit
9600/19200 BAUD
8 data bits
2 Stop Bits <- an extra stop bit

当然,有些设备支持其他组合。