Введение
COM порты чаще всего используется для взаимодействия с различными устройствами, будь то весы, ТСД или фискальники. Причем список не ограничивается торговым оборудованием – некоторые товарищи умудряются даже управлять соляриями.
Для меня основное применение COM портов – это работа со сканерами штрихкодов. Почему не подходит стандартная компонента от 1С? Потому что она умеет только читать данные, но не умеет отправлять. А используя внешнюю библиотеку, мы можем работать с портом напрямую, и передавать данные в обе стороны. Это особенно пригодится для получения обратной связи при сканировании штрихкодов, о чем я писал в предыдущей статье.
Для работы с COM портами существует библиотека от Microsoft под названием MSComm. Библиотека хорошо документирована, в ней есть большое количество разных настроек. В этой статье рассмотрим самый минимальный набор параметров, необходимых для полноценной работы с портом.
Установка библиотеки в систему
Предварительно у вас должно быть два файла: mscomm32.ocx (сама библиотека) и MSCOMM32_License.reg (лицензия). Оба файла легко гуглятся на просторах интернета, но для удобства приложил их к статье.
Порядок действий:
- Копируем файл mscomm32.ocx по адресу C:\Windows\SysWOW64
- Регистрируем компоненту. Для этого запускаем командную строку от имени администратора и пишем:
- regsvr32 "%windir%\SysWOW64\mscomm32.ocx"
- Добавляем информацию о лицензии в реестр путем запуска MSCOMM32_License.reg
- Так как компонента 32хбитная, а Windows у вас скорее всего 64хбитная, следует создать обертку. Для этого:
- Открываем Панель управления – Администрирование – Службы компонентов
- В левом столбике разворачиваем Службы компонентов – Компьютеры – Мой компьютер – Приложения COM+
- Нажимаем правой кнопкой на Приложения COM+ – Создать – Приложение.
- Жмем Далее, Создать новое приложение. Вводим имя mscomm32, Далее, Далее, Далее, Далее, Готово.
- Внутри папки Приложения COM+ появилось наше приложение. Разворачиваем его, нажимаем правой кнопкой на Компоненты – Создать – Компонент.
- Жмем Далее – Импорт уже зарегистрированных компонентов. Ставим галочку “32 разряда”. Находим в списке MSCOMMLib.MSComm.1, жмем Далее (если не нашли, значит не был выполнен п. 2). Готово. Обертка успешно создана.
Чтобы проверить корректность подключения библиотеки, можно выполнить следующий код:
КомПорт = Новый COMОбъект("MsCommLib.MsComm");
Если код выполнился без ошибок, значит, компонента зарегистрирована правильно.
Открываем порт
Убедитесь, что переменная КомПорт объявлена в клиентском модуле формы. Это необходимо, чтобы после инициализации библиотеки можно было обращаться к ней из других процедур.
&НаКлиенте
Процедура ОткрытьПорт()
КомПорт = Новый COMОбъект("MsCommLib.MsComm");
КомПорт.CommPort = НомерПорта;
КомПорт.Settings = "9600,N,8,1";
КомПорт.RThreshold = 1;
КомПорт.PortOpen = Истина;
ДобавитьОбработчик КомПорт.OnComm, ПолученыДанные;
КонецПроцедуры
Уверен, что здесь всё понятно, прокомментирую только две строки.
RThreshold – следует установить в 1, чтобы при получении данных из COM порта (например, при получении веса или сканировании штрихкода) срабатывало событие OnComm, на которое мы подписались ниже. Существует аналогичный параметр SThreshold, чтобы событие срабатывало при отправке данных в порт.
ДобавитьОбработчик – подписываемся на событие OnComm, которое будет возникать при получении данных. В качестве обработчика устанавливаем клиентскую процедуру модуля формы ПолученыДанные().
Чтение данных
Процедура чтения данных выглядит очень просто:
&НаКлиенте
Процедура ПолученыДанные()
Данные = КомПорт.input;
КонецПроцедуры
Отправка данных
Не менее просто выглядит код для отправки данных:
&НаКлиенте
Процедура ОтправитьДанные()
КомПорт.output = Данные;
КонецПроцедуры
Отправка происходит обычным текстом. Однако зачастую оборудование принимает команды в виде HEX строки. Для этих целей воспользуемся встроенными функциями 1С по работе с двоичными данными. Например, устройство ждет от нас следующую HEX строку из 3х байт: “7E 80 00”. Пример кода:
Процедура ОтправитьДанные()
Буфер = ПолучитьБуферДвоичныхДанныхИзHexСтроки("7E8000");
Поток = Новый ПотокВПамяти(Буфер);
ЧтениеТекста = Новый ЧтениеТекста(Поток, КодировкаТекста.ANSI, "", "");
Данные = ЧтениеТекста.Прочитать();
КомПорт.output = Данные;
КонецПроцедуры
Закрытие порта
После работы с COM портом его следует закрыть. Если этого не сделать, то при повторном подключении к порту библиотека сообщит об ошибке: “Port already open” (помогает только ручное завершение процесса dllhost.exe или перезагрузка). Поэтому закрываем порт:
&НаКлиенте
Процедура ЗакрытьПорт()
КомПорт.PortOpen = Ложь;
КомПорт = Неопределено;
КонецПроцедуры
Желательно прописать этот код в обработчике ПередЗакрытиемФормы.
Заключение
Вот и всё, что я хотел рассказать про работу с портами. На мой взгляд ничего сложного, а при использовании библиотеки открываются широкие возможности по взаимодействию с торговым оборудованием. К статье прикрепил саму библиотеку и простую обработку для демонстрации работы с COM портом. Протестировано на 8.3.14.