Как стать автором
Обновить

Комментарии 18

Когда я делал программу для маркировки складских остатков, то тоже сталкивался с некоторыми проблемами обработки кодов GS1. Тут не столько в сканере проблема, сколько в том, что виндовый текстбокс штатно символ ASCII 29 просто "проглатывает". У меня для решения этой проблемы был сделан простейший обходной маневр (на C#):

private void textBoxMark_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\u001d')
{
textBoxMark.Paste("\u2194");
e.Handled = true;
}
}

Т.е. я просто вставлял символ, который сканер сам не передаст, вместо 29. Тут метод Paste очень хорош в том, что практически эмулирует ввод или вставку текста пользователем, при этом и UNDO работает. Внутри этот метод посылает сообщение EM_REPLACESEL.

Это тоже проблема и тоже решаемая, но в подмене GS, о которой я говорил, есть нюанс: у вас (разработчика) все работает, а у пользователя другой сканер и может не работать, и самое обидно даже скорее всего не работает. Пользователь звонит вам , а у вас все работает...

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

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

Можно пойти дальше сделать специальный простенький UI (отдельной утилью или встроить в окно настроек основного приложения) и шаблонный код для сканера. Все, что пришло как нажатие клавиш в это окошко расшифровывается и сравнивается с шаблонным штрихкодом. Отсюда можно вычленить ту последовательность, которую посылает сканер как код GS и внести ее в конфигурацию. Тут любой пользователь справится, не надо вот этих списков кодов на экране и ручного поиска того, что же там такое посылает сканер.

Дык надо этот символ, или если уж идти глубже и обрабатывать несимвольные кнопки типа Fx, то скан-код этой клавиши внести в настройки приложения

Да именно в программе надо настраивать правильное "скажем так" декодирование.

Можно пойти дальше сделать специальный простенький UI (отдельной утилью или встроить в окно настроек основного приложения)

Это конечно был бы идеальный вариант для пользователя, но блин ловить получается надо вообще все нажатия клавиш, а это уже пипец...
К тому жк F8 это только частный случай, а какой-то производитель может задействовать например F2 или Ctrl Atl 5, тут всегда будешь в состоянии, что опять сканер не работает...

Так я же и пишу, что нужен референсный баркод. В нем последовательность типа abcdGS1efgh. Получаете от сканера последовательность клавиш и вcе, что между abcd и efgh считаете кодом GS1. Лучше использовать символы, которые одним нажатием на клавишу получаются, поскольку если в верхнем регистре брать, что сканер может на строку типа ABCD один раз шифт послать, а может на каждый символ нажимать/отжимать.

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

Это самый правильный подход. Если речь о серьезном производстве, то там обычно хелпдески очень хорошо знают все эти нюансы сканеров. Сам работал в дистанционной торговле 15 лет и повидал кучу этих сканеров и другого железа, которое приходилось сопрягать со своим и чужим софтом. Штатный и универсальный способ лучше всего. Однако, бывает такое, что на одном рабочем месте могут использоваться несколько разных программ и каждой может быть нужна своя последовательность кодов от сканера, тогда это приходится по-другому решать, вплоть до прокси-приложения, которое определяет, какое рабочее приложение сейчас работает и подставляет нужные коды вместо тех, что посылает сканер.

Хочу заметить, что не могу подредактировать статью, по-видимому на Хабре что-то поменялось (хотел подправить ошибки), не пойму как... нет режима редактирования

Вспомнил важную деталь про notepad++, который якобы показывает скрытые символы, так вот ему тоже верить нельзя, так как убедился на личном опыте, что иногда он показывает GS символ, а иногда (когда наверное сканер побыстрее) он не показывает GS (хотя они там точно есть).

Notepad++ действительно показывает некоторые непечатаемые символы, в том числе и вводимые с клавиатуры. В этом можно убедиться набрав там Alt-029 (на дополнительных цифровых клавишах). При чем быстрый или не быстрый сканер - не могу понять. Сканер обычно можно настроить на скоростную передачу символов, но тогда теряться будут любые, а не только служебные коды. У меня был кейс, когда символы даже менялись местами на большой скорости передачи, но это было приложение, которое работало в окошке старого NX Client.

но тогда теряться будут любые, а не только служебные коды

Поэтому я написал эту прогу, где все четко и понятно и ничего не теряется (все сканкоды доходят по порядку , естественно). Пока проблем не заметил.

Так потеря скан-кодов не от программы в основном зависит, а от комбинации железа (и его настроек) и среды. Мой пример с NX Client, прямо скажем, резко нехарактерен. Если вашу прогу запустить в этом терминале (будет непросто, конечно, но можно), то эффект будет тот же самый. Символы переставляются где-то в буферах еще до того, как попадут в окошко программы.

Символы переставляются где-то в буферах еще до того, как попадут в окошко программы

Не верю, не должно такого быть, в USB драйвере, точно не должно. Потом смотрите операционка кидает их в программу (через событие) и тут тоже не должно быть вольностей, а вот сама программа уже это как повезет, какой разработчик, какая программа , там все может быть...

Я сам вначале не поверил, что такое может быть. К сожалению, доказать не могу, вся эта система в прошлом. Где-то в репозитории в Дрездене наверняка есть исходники, но в рабочем виде системы не существует, как и самой компании, которая ее использовала. Но могу поклясться, что был такой загадочный эффект, что когда данные со сканера передавались с большой скоростью в окошко NX Client, то соседние символы иногда переставлялись местами. Механизма такого загадочного бага я и сам не понимаю, по всему моему опыту разработки такого быть не должно и не может. Причем NX Client был какой-то довольно древней версии и я более чем уверен, что его обновление решило бы проблему, но дело было в том, что: 1. этот клиент был свободен для использования, а более современный требовал платы за более чем два коннекта (а там их сотни были); 2. софт был плохо совместим с новым NX и допиливать до полной совместимости было невыразимо долго и дорого. Поэтому просто снизили скорость передачи данных со сканера. Кстати, там часть сканеров даже не USB была, а сквозной PS/2. Кто из них так глючил - не помню, может быть оба.

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

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

Это даже не спорю. На то и COM порт.

В настройках сканера есть режим, называется numpad. В этом режиме сканер передает все символы как нажатие alt+ код символа на numpad. Это решает все проблемы и с gs и с переключением раскладки.

Отличная новость, кстати я не знал, что есть такой режим. Получается один сканкод передается как комбинация из 3-4 кодов типа Alt 029.

Я согласен, что хорошо и можно выкрутиться из положения. Но смотрите, у меня сейчас допустим 4 сканера mindeo 6600, space lite, gp 3200, gp 3300, по факту в наличии, купленные для клиента, чтобы решить проблему с проверкой онлайн (через режим клавиатуры).

И в комплекте у всех маленькая бумажка, в которой конечно ничего не говорится про numpad режим. Теперь представьте, что вам надо по удалёнке объяснить кассиру как настроить такой сканер, конечно маловероятно, что это получится...

Но допустим вы настроили сканер в режим numpad, а дальше что ?... Программа товароучетка этот режим понимает? Сколько вы знаете таких товароучеток? Мне например недавно пришлось подключать в ПИ маркет сканер, так эта прога не понимает вообще никаких замен...

На самом деле, по моему личному мнению, проблем ни кого бы не было, если бы производители сканеров вообще ничего не подменяли в передаче Qr кода. Я пытался определить проблемы с передачей реального символа GS через RDP или анидеск, и проблем не обнаружил. То есть все ок передается как есть. Для меня остаётся загадкой вопрос зачем они это делают...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации