2016-02-23 57 views
2

我想發送hex命令到我的設備,因爲它只能理解hex發送字符串到它的十六進制等效

正因爲如此我設法創建一個可以驗證,如果用戶輸入這是一個string有效相應hex功能。問題是here

因此,通過驗證users input是否具有相應的hex等價物,我確信我的系統發送的內容將被我的設備讀取。 By searching我意識到,這需要被轉換爲字節,它指出

使用ASCIIEncoding類convtert字符串字節 的陣列可以傳送。

代碼:

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是 mearly顯示同樣的事情不同的方式。

我的代碼:

'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

是交談的設備將向您介紹一些命令行工具的唯一途徑?沒有一個API可以發送實際字節? – Plutonix

+0

有一個API,我使用[Terminal](https://sites.google.com/site/terminalbpp/)作爲接收器來測試我的系統發送的內容是否真的是十六進制。 –

+1

所以你想要它發送一個字符串的十六進制數字?如果是這樣,你想使用哪種編碼的字符串? ASCII?如果你不想將它作爲字符串發送,那麼你完全困惑,因爲這就是十六進制。十六進制是一個數值的字符串表示。 –

回答

4

要發送的字節的特定序列,不發一個字符串 - 只需發送字節:

Dim process_CMD() As Byte = { &HA0, &H03, &H82, &H04, &HD7 } 
ComPort.Write(process_CMD, 0, process_CMD.Length) 

正如我在上面的評論中提到的那樣,這些值只是數值。關於十六進制沒有什麼特別的。十六進制是表示相同值的另一種方式。通過使用appropriate overload

Dim process_CMD() As Byte = { 160, 3, 130, 4, 215 } 
ComPort.Write(process_CMD, 0, process_CMD.Length) 

如果你有一個字符串的十六進制數字,你可以一個十六進制數字的字符串表示轉換爲字節值:換句話說,上面的代碼不完全一樣的東西,因爲這的Convert.ToByte方法。然而,這只是一次一個字節的轉換,所以,首先你需要分割字符串轉換成字節(每個字節兩個十六進制數字。比如:

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) 
+0

哦,是的。那就是我的意思。但是我怎麼讓'{&HA0,&H03,&H82,&H04,&HD7}取決於用戶輸入? –

+0

那麼,這取決於這些值的含義以及用戶打算如何輸入它們。你是說你只想讓用戶輸入一串十六進制數字的值? –

+0

是的,先生。雖然有一個API我也希望我的用戶輸入用於調試目的的值,所以如果用戶輸入'A0038204D7',它將會像'Dim process_CMD()As Byte = {160,3,130,4,215}'這樣我的設備可以收到'A0038204D7' –

相關問題