Я использую сканер штрих-кода для автоматического заполнения некоторых полей в моей программе. Из наблюдения за переменной данных я знаю, что программа работает, распознавая сканер штрих-кода и собирая отсканированный штрих-код. Проблема в том, что когда я сканирую штрих-код, он также добавляет ChrW(2) в начало и ChrW(3) в конец. Например, «Данные» ChrW(2) и «GDB00015» и ChrW(3). Предполагается, что штрих-код просто сканирует GDB00015, но добавленный текст сбивает мой фильтр. Я видел кое-что об активации/деактивации невидимых символов, но моя модель сканера, похоже, не позволяет этого. Я использую сканер марки Symbol Li2208. Я также знаю сканирование последовательного порта в данных в 32-битном процессе, но я не уверен, может ли это быть причиной.
Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim ErrorReturn As Short = 0 'Used by error handler to store error number
Dim ErrorText As String 'Used by error handler to store error message
Dim DataRxd(4096) As Byte 'raw data from serial port
Dim ReadLength As Short 'length of the data that cam in
Dim WaitTime As Short 'stores how long we wait for all data to get here
Dim idx As Short 'misc used for loops
Dim DataStringRxd As String = "" 'stores string of data we get from serial port
ErrorRetry:
Try
'do the waiting
Sleep(300)
ReadLength = SerialPort1.BytesToRead
'get the data
SerialPort1.Read(DataRxd, 1, 4096)
For idx = 1 To ReadLength
DataStringRxd = DataStringRxd & System.Char.ConvertFromUtf32(DataRxd(idx))
Next idx
'Debug.Print(DataStringRxd)
DecodeBarCode(DataStringRxd)
В сабвуфере есть еще кое-что, но оно предназначено исключительно для отправки кодов ошибок, поэтому я его не добавлял.
Я пытался добавить точки останова, чтобы отслеживать данные по мере их поступления, но, похоже, они возникают при первом сканировании. Я также предполагаю, что это связано с преобразованием utf32. Но я до сих пор не уверен, как удалить начальный и конечный символы.
Прочтите всю документацию SerialPort . Убедитесь, что вы указали правильное значение для SerialPort.NewLine . Поскольку сканер штрих-кода теперь настроен на использование новой строки, можно использовать SerialPort.ReadLine для чтения данных.
Вы можете попробовать добавить следующий код в SerialPort1_DataReceived
: If e.EventType <> SerialData.Chars Then Return End If
Итак, проблема возникла из-за преобразования utf32 в utf16. Поскольку utf32 использует 4 байта на символ, а utf16 использует только 2 байта на символ, преобразование в UTF-16 вводит суррогатные пары для обработки дополнительных символов, что приводит к появлению невидимых символов, о которых я упомянул. То, как я это исправил, сработало в моей ситуации, но я не уверен, что это будет правильным решением.
For idx = 2 To ReadLength - 1
DataStringRxd = DataStringRxd & System.Char.ConvertFromUtf32(DataRxd(idx))
Next idx
'Debug.Print(DataStringRxd)
DecodeBarCode(DataStringRxd)
По сути, теперь я говорю своей программе игнорировать первый и последний символ при завершении преобразования, и я больше не имею дело с суррогатными парами при фильтрации штрих-кодов.
То, как я это исправил, сработало в моей ситуации, но я не уверен, что это будет правильное решение: маловероятно, что это правильное решение. Как описано в моих комментариях под ОП, проблема обычно заключается в неправильной настройке сканера штрих-кода и/или неправильных настройках экземпляра класса SerialPort.
@user246821 user246821 Спасибо. Я немного покопался и смог настроить параметры сканера. Мне не удалось избавиться от Vbcr, но я смог просто удалить его из строки, и это решило мою проблему.
Желательно, чтобы устройство отправляло данные, заканчивающиеся на CRLF
(новая строка). Затем можно использовать SerialPort.ReadLine . Однако необходимо убедиться, что для SerialPort.NewLine установлено правильное значение.
Что произойдет, если вы устраните проблему на уровне сканера или воспользуетесь другой моделью? Я бы предложил специально выбрать этих персонажей и удалить их, а не пропускать их.
Думаю, я неправильно сформулировал это. Я добавил строку «DataStringRxd = DataStringRxd.Replace(vbCrLf, «»)». Это решило мою проблему, но я планирую выяснить, как исправить ее на уровне сканера, это явно кажется более безопасным вариантом.
Как называется производитель? Зебра ? Если да, установите драйвер USB CDC. Затем на странице 32 Справочного руководства по продукту LI2208 (ru) отсканируйте штрих-код хоста USB CDC, чтобы настроить сканер штрих-кода. На странице 38 вы можете рассмотреть возможность сканирования штрих-кода Disable USB Static CDC. На странице 131 отсканируйте штрих-код клавиши Enter (возврат каретки/перевод строки).