Рейтинг:
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
Большое спасибо! Я буду бороться с этим!