我想将hex
个命令发送到我的设备,因为它只能理解hex
。
因此我设法创建一个功能,可以验证用户输入的string
是否具有有效对应的hex
。问题是here。
因此,通过验证users input
是否具有相应的hex
等效值,我相信我的设备会读取系统发送的内容。 By searching我意识到它需要转换为字节,它表示
使用ASCIIEncoding类将字符串转换为字节数组 你可以传播。
代码:
Dim str as String = "12345678"
Dim bytes() as Byte = ASCIIEncoding.ASCII.GetBytes(strNumbers)
' Then Send te bytes to the reader
sp.Write(bytes, 0, bytes.Length)
您不需要将值转换为HEX,在这种情况下,HEX是 显然是一种表达同样事物的不同方式。
我的代码:
'This is a string with corresponding hex value
Dim msg_cmd as string = "A0038204D7"
'Convert it to byte so my device can read it
Dim process_CMD() As Byte = ASCIIEncoding.ASCII.GetBytes(msg_cmd)
'Send it as bytes
ComPort.Write(process_CMD, 0, process_CMD.Length)
我的输出:
41 30 30 33 38 32 30 34 44 37
期望的输出:
A0 03 82 04 D7
答案 0 :(得分:4)
要发送特定的字节序列,请不要发送字符串 - 只需发送字节:
Dim process_CMD() As Byte = { &HA0, &H03, &H82, &H04, &HD7 }
ComPort.Write(process_CMD, 0, process_CMD.Length)
正如我在上面的评论中提到的,值只是数值。十六进制没什么特别的。十六进制只是表示相同值的另一种方式。换句话说,上面的代码与此完全相同:
Dim process_CMD() As Byte = { 160, 3, 130, 4, 215 }
ComPort.Write(process_CMD, 0, process_CMD.Length)
如果字符串中包含十六进制数字,则可以使用Convert.ToByte
方法的appropriate overload将十六进制数字的字符串表示形式转换为字节值。但是,它一次只能转换一个字节,因此,首先需要将字符串拆分为字节(每个字节两个十六进制数字。例如:
Dim input As String = "A0038204D7"
Dim bytes As New List(Of Byte)()
For i As Integer = 0 to input.Length Step 2
bytes.Add(Convert.ToByte(input.SubString(i, 2), 16)
Next
Dim process_CMD() As Byte = bytes.ToArray()
ComPort.Write(process_CMD, 0, process_CMD.Length)
但是,如果字符串在字节之间有空格会更容易。然后你可以使用String.Split
方法:
Dim input As String = "A0 03 82 04 D7"
Dim hexBytes As String() = input.Split(" "c)
Dim bytes As New List(Of Byte)()
For Each hexByte As String in hexBytes
bytes.Add(Convert.ToByte(hexByte, 16)
Next
Dim process_CMD() As Byte = bytes.ToArray()
ComPort.Write(process_CMD, 0, process_CMD.Length)
或者更简单:
Dim input As String = "A0 03 82 04 D7"
Dim process_CMD() As Byte = input.Split(" "c).Select(Function(x) Convert.ToByte(x, 16)).ToArray()
ComPort.Write(process_CMD, 0, process_CMD.Length)