
Встала задача перейти постепенно установить ОС Mint на всех компьютерах завода. У нас есть упаковочные столы на которых готовая продукция перед отправкой, заворачивается в бумагу и взвешивается. Так сложилось, что стояли весовые терминалы Cas и драйвер APScale, который можно свободной найти в интернете под Windows. Поставляется без исходных кодов и запустить драйвер под linux нет возможности.
Apscale.dll отправлял на весы команду, а затем принимал ответ из весов. Инструкцию по протоколу обмена я нашёл, но к сожалению он не заработал.
На помощь пришёл перехватчик данных SERIAL PORT MONITOR. В демо режиме он позволяет перехватить до 15 кБайт данных, для данной задачи вполне достаточно.
В результате исследований, пришлось дописать метод для получения одного байта, и отправки одного байта. При отправке необходимо написать номер символа в кодировке ANSI. Также у метода получить строку, можно указать параметр, символ-окончания строки.
Все изменения есть в репозитории, Sorcecraft, GitHub
&НаКлиенте
Процедура ЗапроситьВесУВесовCAS()
ОчиститьСообщения();
МояКомпонента = Новый("AddIn.ВнешняяКомпонента.ComPortTools");
Если ЭтоПолноправныйПользователь Тогда
Сообщить(СтрШаблон("%1 %2 %3 %4 %5 %6 %7", Число(НомерCOMПортаВесов),Число(Формат(СкоростьПодключенияКВесам,"ЧГ=")),БитыДанных,БитЧетности,СтоповыеБиты,Таймаут, НазваниеLinuxПорта));
КонецЕсли;
МояКомпонента.ИнициализироватьПорт(Число(НомерCOMПортаВесов),Число(Формат(СкоростьПодключенияКВесам,"ЧГ=")),БитыДанных,БитЧетности,СтоповыеБиты,Таймаут, НазваниеLinuxПорта);
МояКомпонента.ОчиститьВходИВыходПорта();
МояКомпонента.ОтправитьСтроку(Символ(5));
БайтДанных = МояКомпонента.ПолучитьБайт();
Если БайтДанных <> 6 Тогда
МояКомпонента.ИнициализироватьПорт(Число(НомерCOMПортаВесов),Число(Формат(СкоростьПодключенияКВесам,"ЧГ=")),БитыДанных,БитЧетности,СтоповыеБиты,Таймаут, НазваниеLinuxПорта);
МояКомпонента.ОтправитьСтроку(Символ(5));
БайтДанных = МояКомпонента.ПолучитьБайт();
Если БайтДанных = 0 Тогда
Сообщить(НСтр("ru = 'Весы не ответили вовремя. Попробуйте запросить вес ещё раз.'"));
КонецЕсли;
КонецЕсли;
МояКомпонента.ОтправитьСтроку(Символ(18));
Результат = МояКомпонента.ПолучитьСтроку(4);
Если Результат = "timeout" ИЛИ ПустаяСтрока(Результат) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Данные с весов не получены. Возможно не правильно настроен порт.';
|en = 'No data has been received from libra. The port may not be configured correctly.'"));
Возврат;
Иначе
Если СтрНайти(Результат, "kgf") <> 0 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Вес нестабильный. Проведите взвешивание ещё раз.'
|;en = 'The weight is unstable. Do the weigh-in again.'"));
Возврат;
Иначе
Количество = НайтиВес(Результат);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
По остальному оборудованию проблем не возникло, на принтер чеков мы установили драйвер с официального сайта, в 1с подключен как обычный принтер, пришлось повозиться с настройками размера бумаги, чтобы этикетка выходила ровно. Драйвер сканеров штрихкодов шёл из коробки в самой 1с, на Linux установился без проблем.
Возможно, данная статья поможет подключить свое устройство COM на других платформах.
---
Картинка для публикации сгенерирована в GigaChat с помощью Kandinsky
Вступайте в нашу телеграмм-группу Инфостарт