大家好日子,
我刚刚在论坛上注册,因为我真的需要帮助。问题是我刚刚开始使用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
结束班
致以最诚挚的问候,我希望你能帮助我。
答案 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