使用VB.Net 2015发送十六进制字节的简单TCP客户端程序

时间:2018-09-02 07:41:41

标签: vb.net

我尝试使用VB.net通过TCP发送十六进制字节。并接收响应数据。

以下我使用的代码

    Dim tcpClient As New System.Net.Sockets.TcpClient()
    tcpClient.Connect("192.168.1.10", 502)
    Dim networkStream As NetworkStream = tcpClient.GetStream()


    If networkStream.CanWrite And networkStream.CanRead Then
        ' Do a simple write.
        Dim sendBytes As [Byte]() = {&H0, &H4, &H0, &H0, &H0, &H6, &H5, &H3, &HB, &HD3, &H0, &H1}
        networkStream.Write(sendBytes, 0, sendBytes.Length)
        ' Read the NetworkStream into a byte buffer.
        Dim bytes(tcpClient.ReceiveBufferSize) As Byte
        networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
        ' Output the data received from the host to the console.
        Dim returndata As String = Encoding.ASCII.GetString(bytes)
        TextBox1.Text = ("Host returned: " + returndata)
    Else
        If Not networkStream.CanRead Then
            TextBox1.Text = "cannot not write data to this stream"
            tcpClient.Close()
        Else
            If Not networkStream.CanWrite Then
                TextBox1.Text = "cannot read data from this stream"
                tcpClient.Close()
            End If
        End If
    End If

我发送sendbytes数据时没有收到任何数据。当我发送数据时,master自动向我发送数据,但是我没有得到任何数据。这是Modbus通信。

我只能看到Host returned:

1 个答案:

答案 0 :(得分:1)

数据在那里,但是您看不到它,因为它以空字节(&H0或仅仅是0)开头。大多数遇到空字节的文本控件都将其解释为字符串的结尾,因此不会呈现其余文本。

GetString()仅按原样获取字节,并将其转换为具有相同值的相应char。您可以将结果转换为可读格式。

解决方案是跳过GetString(),而是迭代数组,将每个字节转换为十六进制或数字字符串。

另外,还有两个非常重要的事情:

  1. 您不应在代码中使用TcpClient.ReceiveBufferSize,因为它用于内部缓冲区。您应该始终自行决定缓冲区大小。

  2. 由于TCP是基于流的协议,因此应用程序层没有数据包的概念。来自服务器的一个“发送”通常不等于一个“接收”。您可能会收到比第一个数据包实际更多或更少的数据。使用NetworkStream.Read()的返回值来确定已读取了多少。

    然后,您需要阅读Modbus文档,并查看其数据中是否包含表明数据包结束或长度的信息。

'Custom buffer: 8 KB.
Dim bytes(8192 - 1) As Byte
Dim bytesRead As Integer = networkStream.Read(bytes, 0, bytes.Length)

Dim returndata As String = "{"

'Convert each byte into a hex string, separated by commas.
For x = 0 To bytesRead - 1
    returnData &= "0x" & bytes(x).ToString("X2") & If(x < bytesRead - 1, ", ", "}")
Next

TextBox1.Text = "Host returned: " & returnData