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

15.09.21

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
mscomm32.zip
.zip 50,28Kb
122
122 Скачать (1 SM) Купить за 1 850 руб.
РаботаСКомПортом.epf
.epf 7,34Kb
101
101 Скачать (1 SM) Купить за 1 850 руб.

Введение

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 1С:Бухгалтерия 3.0 Абонемент ($m)

Простая в использовании обработка https://infostart.ru/1c/tools/1001819/ в целом решает поставленную задачу, но имеет явный недостаток - взаимодействует только с принтерами, подключенными к серверу. Доработанная версия позволяет работать как с принтерами на клиенте, так и на сервере

1 стартмани

30.08.2024    281    3    Sergey1CSpb    0    

4

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

Расширение для вывода информации для покупателя из РМК на второй монитор. Также реализован вывод картинок из каталога в левую часть экрана покупателя. Разработано для УТ 11.5, УНФ 3.0.6 и 3.0.9.

1 стартмани

12.08.2024    721    12    Rastopchinss    10    

3

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

Вывод для клиента на второй монитор (информационное табло) номера заказа в браузер (по умолчанию, например, Яндекс). Внешняя обработка может быть легко переделана под другие конфигурации (нужды) даже начинающим программистом.

1 стартмани

02.08.2024    601    0    AlOkt    0    

5

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

Пример работы с эмулятором дисплея покупателя через библиотеку БПО.

6 стартмани

10.07.2024    596    4    aximo    0    

3

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

Речь пойдет не о сканерах штрихкодов 2D/3D/RF/распознавании лиц и прочего, а о старом добром аппарате, позволяющем считать страницу и отправить ее образ в ПК через COM/USB порт. Рассмотрим, как можно подключить и использовать сканер в типовых 1С-конфигурациях. И что делать, если никак не найти команду настройки сканера.

1 стартмани

28.05.2024    924    Sergey1CSpb    2    

6

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

Расширение для 1С: Розница 2.3 версий 2.3.15.ХХХ и выше. Удобный способ изменения принтера по умолчанию во встроенной обработке печати ценников и этикеток. Только для операционной системы Windows.

1 стартмани

13.05.2024    843    5    independ    0    

5

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

Долгое время я активно пользовался различными хоткеерами, шаблонами текста, специальными раскладками клавиатуры. Я из тех, кто очень долго верил в Снегопат... Так сложилось, что на моем текущем месте работы довольно строгая политика информационной безопасности, а потому со всем привычным софтом, который делал жизнь проще, мне пришлось расстаться. И даже шаблоны кода при каждом терминальном подключении требуется настраивать в конфигураторе заново. Как известно, если какую-то задачу нельзя решить на стороне софта, то стоит поискать железное решение.

1 стартмани

15.04.2024    7734    madonov    60    

36

Периферийные устройства Платформа 1С v8.3 Бесплатно (free)

«У нас было два контроллера Huidu, семьдесят две китайские монохромные панели на светоизлучающих диодах, они же LED, четыре мегабайта flash памяти, 1С и целое море поддерживаемых форматов вывода информации - текстов, картинок, анимаций, а так же литр промывочной жидкости, литр разбавителя, ящик черных чернил, и 12 патч-кордов и различных удлинителей. Не то, чтобы всё это было категорически необходимо в маркировке, но если уж начал собирать маркиратор на 1С, то к делу надо подходить серьёзно.» - Страх и ненависть в Маркировке, 2019 г.

01.04.2024    2511    Interrupted    15    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. frkbvfnjh 802 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 529 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 529 19.02.22 19:31 Сейчас в теме
(13) Можете написать мне в личку. Но сразу скажу, у нас сканеры работают локально, по нюансам с RDP я не подскажу.
18. Galandrix 19.02.22 19:34 Сейчас в теме
26. akor77 198 19.06.22 11:18 Сейчас в теме
(4)тоже самое, сообщения приходят нарезанными по кусочкам. Я их добавляю к "буферной" переменной, потом смотрю, что есть символ перевода строки (ПС) и беру накопленную часть до ПС как целое сообщение. Естественно, из "буферной" переменой отсекаю целое сообщение.
6. Bonza13 05.01.22 14:36 Сейчас в теме
А как сделать проверку доступности устройства на порту? Допустим порт открыт, беспроводной сканер ушёл в спящий режим и после пробуждения связь не восстанавливается так как 1С не засекла отключения из-за открытого порта. Если случайными промежутками открывать и закрывать порт, то могут данные теряться.
7. vv22 529 07.01.22 12:01 Сейчас в теме
(6) Чисто теоретически, при отключении устройства от порта должно срабатывать событие OnComm. Если у вас не срабатывает, тогда даже не знаю, чем помочь. У нас сканера тоже уходят в сон, но порт при этом не закрывается. И при пробуждении продолжают сканировать как ни в чем не бывало, и переподключаться к ним не нужно.
8. Bonza13 07.01.22 12:34 Сейчас в теме
(7)Так в том то и дело, что при засыпании сканера порт остаётся открытым и 1С думает, что сканер никуда не делся что бы с ним опять делать соединение. А при просыпании на сканере видно что он ждёт соединения, но ничего не происходит.
9. vv22 529 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 529 07.01.22 23:10 Сейчас в теме
(11) Попробуйте послать произвольные данные в порт, когда сканер спит.
14. Galandrix 19.02.22 12:36 Сейчас в теме
(12) Вадим, а какой вы сканер используете?
15. vv22 529 19.02.22 19:27 Сейчас в теме
16. Galandrix 19.02.22 19:29 Сейчас в теме
(15) Написал в личку, пишет - Сообщение не отправлено, отложенная группа, как можно с вами связаться? Готов заплатить за консультацию.
19. Galandrix 19.02.22 19:39 Сейчас в теме
(15) Разобрался, у меня новый аккаунт, напишите мне пожалуйста, по правилам форума смогу первый написать только когда 20 одобренных сообщений на форуме будет.
20. erutan 105 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 529 30.03.22 10:06 Сейчас в теме
(21) Через RDP не тестировал, поэтому ничего не могу сказать. Возможно там есть свои нюансы.
23. savauu 31.03.22 04:41 Сейчас в теме
(22)Не смогли победить этот момент. Написали локальный движок на питоне, и завернули в свое АПИ. Но тема интересная. Если у кого есть решение работы 1с с COM через RDP, поделитесь, интересно!
24. Merkalov 11 25.05.22 01:17 Сейчас в теме
На Windows 11 сразу падает в ошибку Port already open, при этом отправить данные на порт не дает, PortOpen = Ложь.
На windows 10 все ок.
25. Merkalov 11 25.05.22 13:12 Сейчас в теме
(24) Был открыт монитор порта из Arduino IDE, вот и падал. Все ок на win 11.
27. mva333 3 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 Сейчас в теме
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) Спасибо добрый человек! Заработало. Сюда месяц не заглядывал, вот только что с инфостарта письмо пришло)
Оставьте свое сообщение