Didier Cauberghe Ответов: 2

Правильный способ записи шестнадцатеричных значений в последовательный порт это для считывателя RFID карт с последовательным подключением


Привет,


У меня есть проблема , я не знаю, как правильно написать шестнадцатеричный код последовательного порта.

Я должен написать следующее в serialport.

&ампер;H02 &амп;h00 автомобиля &усилителя;Н-09 и усилителя;Н35 &амп;закрепительные втулки H32 &амп;H08 &амп;Х99

У меня есть демонстрационная программа, и там я могу видеть, какие коды будут записаны в последовательный порт.


Отправить : 02 00 09 35 32 08 99
Ответить : 06
Отправить : 05
Ответ : 02 00 04 035 32 08 59 03 53


Я попытался сделать следующее :

SerialPort1.Открыть()

Dim code As String = ""

Dim receiveddata As Byte = 0




код = ЧР(&ампер;Н2) + ЧР(&ампер;х0) + ЧР(&ампер;Н9) + ЧР(&ампер;Н35) + ЧР(&ампер;закрепительные втулки H32) + ЧР(&ампер;Н8) + ЧР(&ампер;Х99)

SerialPort1.Write(код)

receiveddata = SerialPort1.ReadByte() ' нормально я должен получить 06 , я получаю 21, так что это не правильно.



Я думаю, что я посылаю неправильный код этот becaude chr(&Hxx) в руководстве он говорит, например, отправить 0x02 0x00 0x09 0x35 0x32 0x08 0x99
Поэтому я думаю, что, возможно, моя система неверна.

Спасибо.


С уважением


Дидье

2 Ответов

Рейтинг:
6

S Houghtelin

Ладно, вот она, черт возьми, какая боль. В любом случае декодирование по умолчанию поддерживает только 128 символов, поэтому значение выше 127 будет отображаться как "?" или 3F.\

Чтобы изменить это, необходимо изменить кодировку SerialPort. (Смотреть ниже)

'Other Serial Port Property
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8
SerialPort1.Encoding = System.Text.Encoding.GetEncoding(28605)


'Then for your output array
'(Note I am ussing an array here this will only work with integers)
Dim arCommand(6) As Int16
 arCommand(0) = &H2
 arCommand(1) = &H0
 arCommand(2) = &H9
 arCommand(3) = &H35
 arCommand(4) = &H32
 arCommand(5) = &H8
 arCommand(6) = &H99

Dim x As Int16 'This one and the array should be declared at the class level

For x = 0 To 6
    SerialPort1.Write(Convert.ToChar(arCommand(x)))
Next

Полный список возможностей кодирования см. По этой ссылке MSDN.
http://msdn.microsoft.com/en-us/library/system.text.encoding.getencodings.aspx[^]

Хорошо, Дидье, проголосуй за эту пятерку, пожалуйста.

С уважением


Didier Cauberghe

Здравствуйте, спасибо за Вашу поддержку. Это было решение проблемы неправильных символов, отправляемых на RFID-устройство, теперь возвращаемые значения такие же, как и в техническом описании. Может быть , еще один вопрос, что мне нужно сделать для чтения на основе той же системы (выше 127), могу ли я сделать просто serialport1.read() Я не знаю всех значений , которые возвращаются, может быть, они также выше 127 большое спасибо С наилучшими пожеланиями Дидье

S Houghtelin

receiveddata = SerialPort1.ReadByte() должен сделать трюк. К настоящему времени вы уже прочитали таблицу ascii и можете использовать десятичные (целочисленные) значения для расшифровки того, что посылает считыватель RFID-карт.

Или вы можете использовать convert.tohex или HEX(n).

Удачи и спасибо!

Member 11720767

Здравствуйте Дорогие Все,

Я столкнулся с проблемой преобразования кода delphi в vb.net... любое тело поможет мне получить решение, Пожалуйста... пожалуйста, проверьте код ниже


m_arTxBfx:массив [0..255] байт; //выходной буфер
m_arRxBfx:массив [0..255] байт; //входной буфер


myPort.ClearBuffer(false,true);
myPort.Write(m_arTxBfx[0],m_InputLength+4);

Теперь мне нужно его преобразовать vb.net

Я уже пробовал этот путь...
myPort.write(m_arTxBfx,m_InputLength,4)

но это показывает ошибку.......

Пожалуйста, помогите мне ...

заранее спасибо

Мозер

S Houghtelin

У вашего вопроса больше шансов получить ответ, если вы разместите его в разделе вопросов и ответов http://www.codeproject.com/Questions/ask.aspx

Когда вы спрашиваете, обязательно добавьте то, что показывает ошибка, ошибка может дать ключ к человеку, который готов помочь.

В то же время я бы посмотрел на синтаксис этой строки:
myPort.write(m_arTxBfx,m_InputLength,4);

Ссылка MSDN: https://msdn.microsoft.com/en-us/library/1050fs1h(v=против 110).aspx

Короче говоря,
myPort.write(array_to_send, first_byte_of_array, number_of_bytes_to_send)

Рейтинг:
19

S Houghtelin

Это выглядит так, как будто вы отправляете данные и получаете ответ.

receiveddata = SerialPort1.ReadByte()
Вы получили 21, это десятичная версия Ascii NAK (Hex 15). Это означает, что устройство не понимает, что вы ему посылаете. Чтобы получить ответ в виде шестнадцатеричного значения, вы можете сделать это:
receiveddata = Hex(SerialPort1.ReadByte())

Для отправки строки данных на устройство я бы использовал:
SerialPort1.WriteLine(code)


С уважением

[Редактировать]
WriteLine добавляет ленту строк к строке, так что, возможно, не так хорошо использовать.
Отправьте каждый из них по отдельности с помощью Write.

Я бы проверил код 0x99, который является частью расширенного формата ascii, и когда я отправляю его в компорт, он читает что-то другое, все остальное выглядит нормально. Еще раз проверьте руководство по эксплуатации устройства .


Didier Cauberghe

Привет,

Спасибо за ваш ответ.

Можете ли вы дать мне совет, как мне нужно отправить коды, такие как 0x02 0x00 0x09 0x35 0x32 0x08 0x99

Is use chr(&h02) + chr(&H0)+ ........ но я не уверен, что это правильный путь.

Спасибо.

br.

Дидье

S Houghtelin

Я думаю, что строка "код", которая у вас есть, должна работать, используйте WriteLine вместо Write.
Подобный этому:
код = ЧР(&ампер;Н2) + ЧР(&ампер;х0) + ЧР(&ампер;Н9) + ЧР(&ампер;Н35) + ЧР(&ампер;закрепительные втулки H32) + ЧР(&ампер;Н8) + ЧР(&ампер;Х99)

SerialPort1.WriteLine(код)

S Houghtelin

Смотрите мой обновленный ответ.

Didier Cauberghe

Привет,

Это тоже не работает.

Что странно, когда я устанавливаю линию прерывания и иду с курсором на кодовое значение цифры не визуальны, есть странные знаки "52™œlœhˆ" вместо 02 00 09 35 32 08 ......

Может ли это быть проблемой ?

Спасибо за ваш совет.

br.

Дидье

S Houghtelin

Это происходит потому, что они являются символами ascii, и на дисплее нет правильного символа.

Посмотрите таблицу ASCII в google, и вы поймете, что я имею в виду.



02 = STX = начало текста

00 = Nul = Null

09 = TAB - горизонтальная вкладка


И так далее.



Кроме того, найдите sysinternals и загрузите утилиту portmon. Это позволит вам контролировать порт связи в действии.



Удачи.

Если вы находите эту информацию полезной, пожалуйста, проголосуйте за рейтинг звезд по ответу. Спасибо.

Didier Cauberghe

Привет,

Спасибо, теперь я вижу, что происходит.

Но я видел , что код, который мне нужно дать, там, кажется, проблема в том, что код смотрит с &H99 &H9C .....
Я использую также chr(&H99) + chr(&H9C)

Когда я проверяю монитор последовательного порта ,в коде, который я посылаю Chr (&H99) + chr (&H9C), есть другие коды 3F, 3F вместо&H99 и&H9C, но они переводятся do 3F 3F, поэтому я думаю, что именно по этой причине RFID не отвечает так, как должно быть .

Вопрос только в том, почему он меняет коды

У вас есть предложение?

Спасибо

Br.

Дидье

S Houghtelin

Как я уже сказал, они являются частью расширенного набора ASCII и не интерпретируются правильно. Это из MSDN.

По умолчанию SerialPort использует ASCIIEncoding для кодирования символов. ASCIIEncoding кодирует все символы, превышающие 127, как (char)63 или '?'. Чтобы поддерживать дополнительные символы в этом диапазоне, установите кодировку в UTF8Encoding, UTF32Encoding или UnicodeEncoding.

Просто потому, что это еще один случай MS, улучшающий мою жизнь, который выводит меня из себя, я должен понять это, потому что это часть моей работы. Я тебе еще позвоню.

Henri Aghaei

в формах VS2013 C# отсутствует "шестнадцатеричный" синтаксис. Что бы вы тогда предложили?

S Houghtelin

В C# есть переменная "byte" , которую можно использовать для анализа потоков файлов. Если вы хотите писать в шестнадцатеричном формате, используйте, например, формат 0x00:
byte byteVar = 0x0F; // Init со значением 15

Henri Aghaei

Спасибо за Ваш быстрый ответ. Ну, на самом деле я читаю из порта и получаю текст вместо шестнадцатеричного кода. Я использовал: textBox2.Text = serialport1.ReadExisting();
Вот почему я спрашиваю, как я могу читать назад в HEX. Есть какие-нибудь советы по этому поводу, пожалуйста?

S Houghtelin

Строки strHEX;
байт byteVal = 0x0F;
// Для чтения обратно в шестнадцатеричном формате
strHEX = строка.Формат("{0:X2}", byteVal);

Имейте в виду, что это строка, она будет выглядеть как шестнадцатеричное значение, но вы не сможете выполнить численные вычисления. Для этого используйте значение байта, как целочисленное значение.

Henri Aghaei

С Houghtelin,

Я не очень уверен, что понял то, что вы только что объяснили.

Вот мой код следующим образом.

byte[] bytesToSend = новый байт[14] { 0x68,0x99,0x99,0x99,0x99,0x99,0x68,0x23,0x02,0x61,0x00,0xEC,0x16 };


serialport1.Write(bytesToSend, 0, 14);

Система.Нарезание резьбы.Нить.Sleep(200); // подождите .5 сек.




поле textbox2.Текст = serialport1.ReadExisting();


Но то, что вы сказали по формату, мне непонятно. Что я должен добавить в свой буфер чтения, чтобы увидеть вход Hex?

S Houghtelin

Вот, держи.

byte[] bytesToSend = новый байт[14] { 0x68,0x99,0x99,0x99,0x99,0x99,0x68,0x23,0x02,0x61,0x00,0xEC,0x16 };


serialport1.Write(bytesToSend, 0, 14);

Система.Нарезание резьбы.Нить.Sleep(200); // подождите .5 сек.


byte[] buffer = новый байт[последовательный.BytesToRead];
serialport1.Read(buffer, 0, buffer.Длина);

StringBuilder strHEX = новый StringBuilder();

for (int i = 0; i < буфер.Длина; i++)
стрэкс.AppendFormat("{0:X2} ", буфер[i]);

поле textbox2.Текст = strHEX;

Если я сделаю больше, мне придется начать выставлять счета. ;)

Henri Aghaei

Нет. Не делай этого, пожалуйста! ЛОЛ

Я намеревался сделать такой же формат для буфера чтения, но проблема в том, что

поле textbox2.Текст = strHEX

это неприемлемо, и мне нужно найти способ поместить мой шестнадцатеричный массив в коробку!


Возникает следующая ошибка.

Ошибка 1 не удается неявно преобразовать тип "System.Text.StringBuilder" в "string"

S Houghtelin

Затем преобразуйте его в строку.
поле textbox2.Текст = метод toString(strHEX);

Вы не слишком долго пользуетесь C#? Это становится легче, чем больше вы используете его.

Полезный ресурс, который я использую для вопросов C#, - это https://www.dotnetperls.com/ (проект кода также является отличным ресурсом).

Henri Aghaei

Большое спасибо! Я буду бороться с этим!