使用Visual Basic 2005发送HEX命令

时间:2014-12-09 16:14:27

标签: vb.net tcp hex lan

大家好日子,

我刚刚在论坛上注册,因为我真的需要帮助。问题是我刚刚开始使用Visual Studio 2005(因为那是我们在这里所拥有的),我的意图是使用TCP LAN与设备进行通信,我知道设备的IP和端口.....问题是设备只识别命令的十六进制值。我能做的唯一事情就是在2个套件之间使用winockets进行某种聊天程序来启用IP /端口通信,但是你知道聊天程序只发送strin数组。

这是我需要做的一个例子。

我在表单上有两个文本框,一个名为command1,另一个名为send_receive

在command1文本框上我手动输入我需要发送的HEX,例如...... 05 6C 29 F1 3C 81 有了它,设备需要回答我... 0C 00 6C F1 29 7C 81 30 34 31 34 39 39

并且在send_receive文本框中我需要使用autoscroll查看我发送的命令,然后是我收到的命令...

某些视觉上它看起来像这样......好吧

- command1 textbox -

05 6C 29 F1 3C 81

- send_receive文本框 -

< - 05 6C 29 F1 3C 81
- > 0C 00 6C F1 29 7C 81 30 34 31 34 39 39

我也是如此陷入困境正在从文本框中的05 6C 29 F1 3C 81字符串变为十六进制05 6C 29 F1 3C 81用于发送......

这里是我所做的代码,记住它已经完成了2个人之间的聊天,我需要知道我需要改变什么才能得到上面提到的,它是一个简短的代码所以我会发布所有内容以防万一:D

导入System.IO Imports System.Net.Sockets

Public Class Form1     Dim listener As New TcpListener(1001)     昏暗的客户端作为TcpClient     昏暗消息As String =""

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    listener.Stop()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    listener.Start()
    Timer1.Enabled = True
    Timer1.Start()

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    Try
        If listener.Pending = True Then
            message = ""
            client = listener.AcceptTcpClient()
            Dim reader As New StreamReader(client.GetStream())
            While reader.Peek > -1
                message = message + Convert.ToChar(reader.Read()).ToString
            End While
            Me.Focus()
            TextBox4.Text = (TextBox4.Text + message + vbCrLf)
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Try
        If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Then
            MsgBox("Enter a username, enter a valid IP, enter a port, and enter a message.", MsgBoxStyle.Exclamation)

        Else
            client = New TcpClient(TextBox2.Text, 1001)
            Dim writer As New StreamWriter(client.GetStream())
            writer.Write(TextBox3.Text)
            writer.Flush()
            TextBox3.Text = ""
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical)
    End Try

End Sub

结束班

致以最诚挚的问候,我希望你能帮助我。

2 个答案:

答案 0 :(得分:0)

您可以使用Convert.ToByte方法将十六进制值转换为字节。将字符串拆分为单独的十六进制代码并将每个代码转换为一个字节,然后您可以将它们写入流中。

请注意,您应该直接使用客户端流,因为StreamWriter只将文本写入流,而不是字节。

Dim parts As String() = TextBox3.Text.Split(" "C)
Dim bytes(parts.Length) As Byte
For i As Integer = 0 To parts.Length - 1
  bytes(i) = Convert.ToByte(parts(i), 16)
Next
client = New TcpClient(TextBox2.Text, 1001)
Dim stream As Stream = client.GetStream()
stream.Write(bytes, 0, bytes.Length)
stream.Flush()

当您读取数据时,您可以将字符代码转换为十六进制表示:

message = message + reader.Read().ToString("x2") + " "

streamreader尝试使用特定的编码将数据解码为字符,因此如果响应不能作为文本处理,则可能需要从客户端流中读取它而不使用流读取器

答案 1 :(得分:0)

尝试将十六进制命令列表转换为字节数组并发送:

    Try
        Dim cmds As New List(Of Byte)
        For Each cmd As String In TextBox1.Text.Trim.Split(" ")
            cmds.Add(Convert.ToByte(cmd, 16))
        Next
        Dim bytes() As Byte = cmds.ToArray
        client.GetStream.Write(bytes, 0, bytes.Length)
    Catch ex As Exception
        MessageBox.Show("Invalid Hex Command")
    End Try