2016-02-23 3 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, в этом случае 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? Если вы не хотите отправлять его в виде строки, то вы полностью сбиты с толку, потому что это то, что такое hex. Hex представляет собой строковое представление числового значения. –

ответ

4

Чтобы отправить определенную последовательность байтов, не отправлять строка - просто отправьте байты:

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

Как я уже упоминал в приведенных выше замечаниях, значения представляют собой только числовые значения. Нет ничего особенного в гексагоне. Hex - это еще один способ представить одни и те же значения. Другими слова, код выше делает то же самое, как это:

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

Если у вас есть шестнадцатеричные цифры в строке, вы можете преобразовать строковое представление шестнадцатеричного числа до значения байт с помощью appropriate overload метода 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} 'so my устройство может получить 'A0038204D7' –

Смежные вопросы