Как избавиться от невидимых символов со сканера штрих-кода?

Я использую сканер штрих-кода для автоматического заполнения некоторых полей в моей программе. Из наблюдения за переменной данных я знаю, что программа работает, распознавая сканер штрих-кода и собирая отсканированный штрих-код. Проблема в том, что когда я сканирую штрих-код, он также добавляет 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. Но я до сих пор не уверен, как удалить начальный и конечный символы.

Как называется производитель? Зебра ? Если да, установите драйвер USB CDC. Затем на странице 32 Справочного руководства по продукту LI2208 (ru) отсканируйте штрих-код хоста USB CDC, чтобы настроить сканер штрих-кода. На странице 38 вы можете рассмотреть возможность сканирования штрих-кода Disable USB Static CDC. На странице 131 отсканируйте штрих-код клавиши Enter (возврат каретки/перевод строки).

user246821 08.07.2024 20:16

Вы можете попробовать добавить следующий код в SerialPort1_DataReceived: If e.EventType <> SerialData.Chars Then Return End If

user246821 09.07.2024 23:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, проблема возникла из-за преобразования 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 08.07.2024 20:51

@user246821 user246821 Спасибо. Я немного покопался и смог настроить параметры сканера. Мне не удалось избавиться от Vbcr, но я смог просто удалить его из строки, и это решило мою проблему.

ShapeShifter42 09.07.2024 15:07

Желательно, чтобы устройство отправляло данные, заканчивающиеся на CRLF (новая строка). Затем можно использовать SerialPort.ReadLine . Однако необходимо убедиться, что для SerialPort.NewLine установлено правильное значение.

user246821 09.07.2024 17:36

Что произойдет, если вы устраните проблему на уровне сканера или воспользуетесь другой моделью? Я бы предложил специально выбрать этих персонажей и удалить их, а не пропускать их.

djv 09.07.2024 20:03

Думаю, я неправильно сформулировал это. Я добавил строку «DataStringRxd = DataStringRxd.Replace(vbCrLf, «»)». Это решило мою проблему, но я планирую выяснить, как исправить ее на уровне сканера, это явно кажется более безопасным вариантом.

ShapeShifter42 10.07.2024 14:43

Другие вопросы по теме