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

15.09.21

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

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

Скачать исходный код

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

Введение

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.


См. также

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

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

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

20400 руб.

31.05.2023    3946    3    1    

4

Тернистый путь к физической клавиатуре для программиста 1С

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

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

1 стартмани

вчера в 11:00    3716    madonov    35    

26

[История разработки] Управляем промышленным принтером EBS-1500 из 1С

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

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

01.04.2024    1230    Interrupted    14    

34

Получение изображения с веб-камеры с возможностью его кадрирования по произвольной области

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

Внешняя обработка получения изображения с веб-камеры с возможностью его кадрирования по произвольно выделенной области. Использует собственную внешнюю компоненту на основе библиотеки AForge. Содержит примеры интерактивного взаимодействия с полем HTML.

20.03.2024    395    1    AndSem    1    

4

Прямая печать на принтерах TSC из 1С

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

Прямая печать на принтерах TSC из 1С при вызове с сервера позволяет печатать из тонкого клиента, мобильного клиента и веб-клиента. Потребуется установка драйвера и библиотеки для отправки команд на этот драйвер.

1 стартмани

19.02.2024    619    5    realslavyan    0    

5

HotKeys на Python для 1С

Периферийные устройства Конфигурации 1cv8 Бесплатно (free)

Недавно прочитал статью на Инфостарте о KeyPad и вначале захотел себе такой, но через какое-то время я понял, что дополнительная даже маленькая клавиатура занимает место, и нужно все время держать ее под рукой. Это все создает дополнительные неудобства.

20.12.2023    5343    John_d    26    

74

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

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

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

1 стартмани

07.11.2023    1305    2    vsnazarov    1    

26

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

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

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

29.08.2023    1544    GeraltSnow    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. frkbvfnjh 787 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 Сейчас в теме
26. akor77 197 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 Сейчас в теме
16. Galandrix 19.02.22 19:29 Сейчас в теме
(15) Написал в личку, пишет - Сообщение не отправлено, отложенная группа, как можно с вами связаться? Готов заплатить за консультацию.
19. Galandrix 19.02.22 19:39 Сейчас в теме
(15) Разобрался, у меня новый аккаунт, напишите мне пожалуйста, по правилам форума смогу первый написать только когда 20 одобренных сообщений на форуме будет.
20. erutan 104 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 Сейчас в теме
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) Спасибо добрый человек! Заработало. Сюда месяц не заглядывал, вот только что с инфостарта письмо пришло)
Оставьте свое сообщение