Полноценная работа с COM портом через библиотеку MSComm

15.09.21

Интеграция - Периферийные устройства

Чтение и запись в COM порт через библиотеку MSComm. Без бесконечных циклов и прочих костылей.

Скачать файлы

Наименование Файл Версия Размер
mscomm32.zip
.zip 50,28Kb
91
.zip 50,28Kb 91 Скачать
РаботаСКомПортом.epf
.epf 7,34Kb
73
.epf 1.0 7,34Kb 73 Скачать

Введение

COM порты чаще всего используется для взаимодействия с различными устройствами, будь то весы, ТСД или фискальники. Причем список не ограничивается торговым оборудованием – некоторые товарищи умудряются даже управлять соляриями

Для меня основное применение COM портов – это работа со сканерами штрихкодов. Почему не подходит стандартная компонента от 1С? Потому что она умеет только читать данные, но не умеет отправлять. А используя внешнюю библиотеку, мы можем работать с портом напрямую, и передавать данные в обе стороны. Это особенно пригодится для получения обратной связи при сканировании штрихкодов, о чем я писал в предыдущей статье.

Для работы с COM портами существует библиотека от Microsoft под названием MSComm. Библиотека хорошо документирована, в ней есть большое количество разных настроек. В этой статье рассмотрим самый минимальный набор параметров, необходимых для полноценной работы с портом.

 

Установка библиотеки в систему

Предварительно у вас должно быть два файла: mscomm32.ocx (сама библиотека) и MSCOMM32_License.reg (лицензия). Оба файла легко гуглятся на просторах интернета, но для удобства приложил их к статье.

Порядок действий:

  1. Копируем файл mscomm32.ocx по адресу C:\Windows\SysWOW64
  2. Регистрируем компоненту. Для этого запускаем командную строку от имени администратора и пишем:
  3. regsvr32 "%windir%\SysWOW64\mscomm32.ocx"
  4. Добавляем информацию о лицензии в реестр путем запуска MSCOMM32_License.reg
  5. Так как компонента 32хбитная, а Windows у вас скорее всего 64хбитная, следует создать обертку. Для этого:
    1. Открываем Панель управления – Администрирование – Службы компонентов
    2. В левом столбике разворачиваем Службы компонентов – Компьютеры – Мой компьютер – Приложения COM+
    3. Нажимаем правой кнопкой на Приложения COM+ – Создать – Приложение.
    4. Жмем Далее, Создать новое приложение. Вводим имя mscomm32, Далее, Далее, Далее, Далее, Готово.
    5. Внутри папки Приложения COM+ появилось наше приложение. Разворачиваем его, нажимаем правой кнопкой на Компоненты – Создать – Компонент.
    6. Жмем Далее – Импорт уже зарегистрированных компонентов. Ставим галочку “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.


См. также

Очистка очереди печати конкретного принтера

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Очистка очереди печати выбранного принтера, перезапуск службы печати, вывод списка системных принтеров, открытие свойств принтера из 1С.

1 стартмани

07.11.2023    967    1    vsnazarov    1    

24

Печать этикеток на DYMO LabelManager 280 через DYMO Connect Web Service

Периферийные устройства WEB-интеграция Этикетки, ценники Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

На сайте производителя принтера DYMO LabelManager 280 вместе с драйвером поставляется пакет DYMO Connect, который предлагает функционал вёрстки этикеток в фирменном формате и отправки их напрямую на принтер. Так же в этом пакете есть веб-сервис для взаимодействия с принтером через HTTP-запросы, о котором и пойдет речь в этой статье.

29.08.2023    808    GeraltSnow    0    

3

Распознавание номеров автомашин с ip - камер, видео, фото

Периферийные устройства Распознавание документов и образов Автомобили, автосервисы Россия Платные (руб)

Программа считывает кадры с ip-камер (http - запрос к камере), видео, фото (источники кадров (нет ограничения на их количество) настраивается в конфигурационном файле), находит и распознает номера автомашин и сохраняет в базу db, с сохранением фото номера и автомашины, а также времени детекции.

20400 руб.

31.05.2023    3321    1    1    

2

Второй монитор в качестве дисплея покупателя

Розничная торговля Периферийные устройства Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Использование второго монитора в качестве дисплея покупателя. Выполнено в качестве расширения.

1 стартмани

02.02.2023    2698    18    windsurf    3    

4

Космическая Одиссея 2020 года

Мониторинг Периферийные устройства Языки и среды Бесплатно (free)

Организация потокового обмена системы 1С с большим количеством разнородных устройств – нетривиальная задача. О том, как организовать архитектуру такого решения с учетом возможного масштабирования хранимых данных и поддерживаемых интерфейсов, на конференции Infostart Event 2021 Post-Apocalypse рассказал TeamLead и специалист по внедрению компании ИнфоСофт Григорий Шатров.

11.11.2022    3215    G.Shatrov    2    

25

Подсистема печати на сетевые принтеры по протоколу IPP/HTTP без драйверов из любой ОС и серверного контекста

Периферийные устройства Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Печать на сетевые принтеры по протоколу IPP как напрямую, так и с иcпользованием сервера CUPS. Подсистема позволяет печатать из серверного, клиентского контекста, регламентных и фоновых заданий и не требует установки какого-то дополнительного ПО, библиотек и драйверов принтеров как на сервер 1С Предприятия, так и на клиента. Получение статуса принтера, информации о нем и результатов печати. Никаких внешних компонент не используется, под капотом HTTP и работа с двоичными данными средствами платформы. Сериализатор и десериализатор протокола IPP позволяет относительно легко доработать подсистему для поддержки нереализованных методов и типов данных протокола IPP.

5 стартмани

19.08.2022    2541    11    dumsik    6    

8

Мониторинг ИБП МАП и выключение, включение серверов

Сервера Мониторинг Периферийные устройства Платформа 1С v8.3 Абонемент ($m)

В качестве источника бесперебойного питания серверов можно использовать сетевой инвертор и сборку литиевых аккумуляторов. Единственное, чтобы это работало без участия человека, нужно выключать сервера, когда АКБ разряжается, и включать их обратно, когда сетевое напряжение появилось и АКБ зарядился. С этим вполне может справляться и программа на 1С. Далее описывается программа мониторинга и схема подключения МАП Тitanator UPS (Микроарт) с АКБ Vektor LFP (LiFePO4). Обмен данными ведется по протоколу HTTP.

1 стартмани

16.08.2022    3791    2    vad7    0    

1
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. frkbvfnjh 774 15.09.21 15:44 Сейчас в теме
Отличная статья!
2. RS_Sed 05.10.21 17:04 Сейчас в теме
Не завелось.
3. RS_Sed 06.10.21 14:50 Сейчас в теме
Сканер пищит через обработку, но через библиотеку работать не хочет
4. chipic129 11.11.21 15:51 Сейчас в теме
Работает, НО!, Иногда данные рвутся, часть посылки приходит отдельным вызовом функции. Возможно, есть какой-то нюанс, который я не учел?
Прикрепленные файлы:
5. vv22 526 13.11.21 17:46 Сейчас в теме
(4) Странно, с таким не сталкивался. Причем у нас эта библиотека уже давно работает со сканерами штрихкодов, никаких проблем нет, данные не теряются. Может вы задали неправильные настройки порта? Например, в Putty у вас одна скорость, в свойстве Settings - другая. Или как вариант, попробуйте любой другой эмулятор порта.
13. Galandrix 19.02.22 12:31 Сейчас в теме
(5)
(4) Странно, с таким не сталкивался. Причем у нас эта библиотека уже давно работает со сканерами штрихкодов, никаких проблем нет, данные не теряются. Может вы задали неправильные настройки порта? Например, в Putty у вас одна скорость, в свойстве Settings - другая. Или как вариант, попробуйте любой другой эмулятор порта.


Вадим, можно как-то с вами связаться? Не можем завести библиотеку, хотим заставить сканеры пищать по RDP

Вот тендер, цена обсуждается, готовы заплатить просто за консультацию если вы заняты
https://infostart.ru/freelance/1609284/
17. vv22 526 19.02.22 19:31 Сейчас в теме
(13) Можете написать мне в личку. Но сразу скажу, у нас сканеры работают локально, по нюансам с RDP я не подскажу.
18. Galandrix 19.02.22 19:34 Сейчас в теме
(17) Пытаюсь)
26. akor77 196 19.06.22 11:18 Сейчас в теме
(4)тоже самое, сообщения приходят нарезанными по кусочкам. Я их добавляю к "буферной" переменной, потом смотрю, что есть символ перевода строки (ПС) и беру накопленную часть до ПС как целое сообщение. Естественно, из "буферной" переменой отсекаю целое сообщение.
6. Bonza13 05.01.22 14:36 Сейчас в теме
А как сделать проверку доступности устройства на порту? Допустим порт открыт, беспроводной сканер ушёл в спящий режим и после пробуждения связь не восстанавливается так как 1С не засекла отключения из-за открытого порта. Если случайными промежутками открывать и закрывать порт, то могут данные теряться.
7. vv22 526 07.01.22 12:01 Сейчас в теме
(6) Чисто теоретически, при отключении устройства от порта должно срабатывать событие OnComm. Если у вас не срабатывает, тогда даже не знаю, чем помочь. У нас сканера тоже уходят в сон, но порт при этом не закрывается. И при пробуждении продолжают сканировать как ни в чем не бывало, и переподключаться к ним не нужно.
8. Bonza13 07.01.22 12:34 Сейчас в теме
(7)Так в том то и дело, что при засыпании сканера порт остаётся открытым и 1С думает, что сканер никуда не делся что бы с ним опять делать соединение. А при просыпании на сканере видно что он ждёт соединения, но ничего не происходит.
9. vv22 526 07.01.22 16:48 Сейчас в теме
(8) Тогда не знаю. Я бы попробовал еще посмотреть мануал по сканеру, может там есть какие-то настройки, связанные с засыпанием.
10. Bonza13 07.01.22 18:33 Сейчас в теме
(9)Да не, это проблема только 1С, сканер обычный китайский. Но я пробовал и это приложение на телефон Облачный Терминал Сбора Данных и Сканер Штрих-кода, и с ним такая же ситуация всё работает до тех пор, пока на телефоне не отключить блютус, в 1С порт остаётся открыт, а при включении на телефоне написано "Ожидание соединения", разрабам писал, но они тоже говорят что дело в 1С, однако соединение по идее должно восстанавливаться.
Прикрепленные файлы:
11. Bonza13 07.01.22 18:43 Сейчас в теме
Сейчас случайно зашёл в НСИ>Штрихкоды с выключенным сканером и выдало такое сообщение на картинке. То есть 1С, таки, проверяет факт доступности устройства перед подключением к нему. Осталось выяснить только что это за процедура и поставить её в фоновое задание крутиться каждую секунду, думаю это могло бы решить проблему.
Прикрепленные файлы:
12. vv22 526 07.01.22 23:10 Сейчас в теме
(11) Попробуйте послать произвольные данные в порт, когда сканер спит.
14. Galandrix 19.02.22 12:36 Сейчас в теме
(12) Вадим, а какой вы сканер используете?
15. vv22 526 19.02.22 19:27 Сейчас в теме
(14) Zebra LI4278
16. Galandrix 19.02.22 19:29 Сейчас в теме
(15) Написал в личку, пишет - Сообщение не отправлено, отложенная группа, как можно с вами связаться? Готов заплатить за консультацию.
19. Galandrix 19.02.22 19:39 Сейчас в теме
(15) Разобрался, у меня новый аккаунт, напишите мне пожалуйста, по правилам форума смогу первый написать только когда 20 одобренных сообщений на форуме будет.
20. erutan 98 20.03.22 09:41 Сейчас в теме
Здравствуйте, коллеги.
Обработку ранее скачивал, использовал, и тд.
com-порты используем.

Но хочу сейчас переделать, в связи с чем вопрос

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

Обработка = Обработки.КонтрольДокумента.Создать();

msword = Новый COMОбъект("Word.Application");
ДобавитьОбработчик msword.DocumentChange, ПриИзмененииДокумента;
//....

msword2 = Новый COMОбъект("Word.Application");
ДобавитьОбработчик msword2.DocumentChange, ПриИзмененииДокумента;

Процедура ПриИзмененииДокумента()    
    Сообщить("Документ изменен");
   //а какой ком-объект сработал? msword  или msword2?

   //применительно к компорту, тут должно быть Данные = КомПорт.input; ИЛИ Данные = КомПорт2.input; - в этом и загвоздка
КонецПроцедуры
Показать



....
Впрочем, кажется, нашел путь
[Form.]MSComm.CommEvent


Процедура весы1_ПолученыДанные()

если КомПорт1.CommEvent=2 тогда // Получено RThreshold символов
сообщить("Ок");
конецесли;
21. savauu 29.03.22 16:46 Сейчас в теме
Не видет проброшенные по RDP порты? Или это у меня что-то не получается?
22. vv22 526 30.03.22 10:06 Сейчас в теме
(21) Через RDP не тестировал, поэтому ничего не могу сказать. Возможно там есть свои нюансы.
23. savauu 31.03.22 04:41 Сейчас в теме
(22)Не смогли победить этот момент. Написали локальный движок на питоне, и завернули в свое АПИ. Но тема интересная. Если у кого есть решение работы 1с с COM через RDP, поделитесь, интересно!
24. Merkalov 8 25.05.22 01:17 Сейчас в теме
На Windows 11 сразу падает в ошибку Port already open, при этом отправить данные на порт не дает, PortOpen = Ложь.
На windows 10 все ок.
25. Merkalov 8 25.05.22 13:12 Сейчас в теме
(24) Был открыт монитор порта из Arduino IDE, вот и падал. Все ок на win 11.
27. mva333 2 27.07.22 12:38 Сейчас в теме
(23) Решали скорость работы проброса COM портов через RDP с помощью программ пробрасывающих COM через сеть. На клиенте стоит программа "Pira CZ Remote COM Port", а на сервере "Tibbo Device Server Toolkit".
28. Gaster 24.11.22 16:33 Сейчас в теме
Благодарим, работает
29. Akasy 5 17.01.23 23:57 Сейчас в теме
Здравствуйте!
Сейчас есть задача по записи на датчики некой строки, и командой КомПорт.Output = "any_string" ничего не получается записать. Почитала в документации к mscomm.ocx, вот такую инфу:
Синтаксис:

[Form.]MSComm.Output = cOutString
Установки:
cOutString
Задает символьную строку, записываемую в буфер передачи.

Комментарии:
Недоступно на этапе разработки, доступно только для записи на этапе выполнения.

Подскажите, пожалуйста, кто знает, что значит "доступно только для записи на этапе выполнения"?
30. R_Wanderer 23.03.23 20:52 Сейчас в теме
Доброго времени!
С новыми релизами платформы работает нормально?
8.3.21 и выше?
33. smit1c 106 18.10.23 13:08 Сейчас в теме
(30) с 8.3.22.1923 работает.
31. micro 06.09.23 17:09 Сейчас в теме
Добрый день. При отправлении смс выаёт: ActiveX компонент MSCOMM32.OCX не лицензирован для использования!
А где взять эту лицензию?
Прикрепленные файлы:
32. rintik 19 06.09.23 17:25 Сейчас в теме
(31)В реестр ключ добавьте. Должно помочь.
[HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d]
@="mlrljgrlhltlngjlthrligklpkrhllglqlrk"
35. ИНТЕГРА 25 15.11.23 10:20 Сейчас в теме
(32)
(31)
После добавления ключа в реестр надо ПЕРЕЗАГРУЗИТЬ комп.
2 дня убил с этими лицензиями. Какие только не перепробовал - компонента на лицензию ругалась.
34. micro 18.10.23 17:07 Сейчас в теме
(33) Спасибо добрый человек! Заработало. Сюда месяц не заглядывал, вот только что с инфостарта письмо пришло)
Оставьте свое сообщение