Интеграция учетной системы 1С с микроконтроллерами (например, Arduino) позволяет автоматизировать физические процессы: управление электромагнитными замками витрин, светодиодной индикацией, шлагбаумами или датчиками. Однако при попытке отправить управляющие символы в последовательный интерфейс (COM-порт) разработчики часто сталкиваются с ситуацией, когда через терминальные программы вроде PuTTY всё работает корректно, а команды из командной строки Windows или встроенного языка 1С не дают результата.
В этой статье разберем физические и программные причины такого поведения, а также рассмотрим рабочие способы организации обмена данными между 1С:Предприятие 7.7 и контроллером.
Проанализируем ситуацию: почему вызов вида set /p x="1" < nul > \\.\COM5 или echo 1 > COM5 заставляет светодиод на плате мигать, но контроллер не выполняет команду (например, не открывает замок)?
RESET микроконтроллера через конденсатор. При открытии порта операционной системой уровень DTR падает, вызывая перезагрузку микроконтроллера и запуск загрузчика (bootloader). Командная строка открывает порт на долю секунды, отправляет байт и сразу закрывает соединение. Контроллер в этот момент уходит в перезагрузку и физически не успевает принять или обработать данные. В PuTTY порт остается постоянно открытым, поэтому сброс происходит только один раз в момент подключения.echo 1 отправляет не только символ «1», но и невидимые символы возврата каретки и перевода строки (\r\n), что может ломать логику обработки в скетче.В платформе 1С:Предприятие 7.7 нет штатных объектов для прямого доступа к аппаратным портам ввода-вывода. Наиболее надежный и простой путь — использование специализированной внешней компоненты (например, vk_rs232 или аналогичных Native/COM-библиотек). Компонента единожды открывает COM-порт при запуске сеанса или перед началом обмена, удерживает соединение открытым и передает «чистые» байты без лишних терминаторов.
Рассмотрим пример подключения и передачи данных через внешнюю компоненту в 1С 7.7:
// Загрузка внешней компоненты
Если ЗагрузитьВнешнююКомпоненту("vk_rs232.dll") = 0 Тогда
Предупреждение("Не удалось загрузить компоненту vk_rs232.dll");
Возврат;
КонецЕсли;
// Создание объекта компоненты
Порт = СоздатьОбъект("AddIn.vk_rs232");
// Настройка параметров подключения: номер порта, скорость, четность, биты данных, стоп-биты
Порт.Параметры(5, 9600, 0, 8, 1);
// Открытие порта
Если Порт.Открыть() = 1 Тогда
// Отправка управляющего символа для открытия замка
Порт.Записать("1");
// Закрытие порта после завершения сеанса работы
Порт.Закрыть();
Иначе
Сообщить("Ошибка открытия COM-порта!");
КонецЕсли;
Еще один классический вариант взаимодействия с последовательным портом — использование системного элемента управления MSCommLib.MSComm (библиотека MSCOMM32.OCX). Данный компонент регистрируется в Windows и доступен через стандартный механизм СоздатьОбъект().
Разберем пример работы с MSComm32:
Комм = СоздатьОбъект("MSCOMMLib.MSComm");
// Указываем номер COM-порта (5)
Комм.CommPort = 5;
// Скорость 9600, без четности, 8 бит данных, 1 стоп-бит
Комм.Settings = "9600,N,8,1";
// Отключаем управление линией DTR, чтобы избежать перезапуска платы
Комм.DTREnable = 0;
// Открываем порт
Комм.PortOpen = 1;
// Передаем команду контроллеру
Комм.Output = "1";
// Закрываем порт при необходимости
Комм.PortOpen = 0;
Если в системе не хочется использовать устаревшие OCX-компоненты, можно задействовать класс System.IO.Ports.SerialPort из платформы .NET через внешние COM-обертки или скрипты PowerShell. Это позволяет гибко настраивать таймауты, скорость, флаги DTR/RTS и выполнять асинхронную отправку без блокировки пользовательского интерфейса 1С.
Если требуется выполнить отправку без дополнительных библиотек средствами операционной системы, необходимо предварительно инициализировать порт утилитой mode, отключив управление линией DTR:
mode COM5: BAUD=9600 PARITY=N DATA=8 STOP=1 dtr=offПосмотрим на пример вызова из встроенного языка 1С 7.7 через системную команду:
КомандаНастройки = "mode COM5: BAUD=9600 PARITY=N DATA=8 STOP=1 dtr=off";
КомандаОтправки = "set /p x=""1"" < nul > \\.\COM5";
КомандаСистемы(КомандаНастройки);
КомандаСистемы(КомандаОтправки);
Если отправка команд осуществляется сторонними программами, не позволяющими управлять линией DTR программно, рекомендуется доработать аппаратную часть схемы:
RESET и GND платы Arduino (плюс к RESET, минус к GND). Конденсатор сгладит импульс сброса при открытии порта. Обратите внимание: на время прошивки скетча конденсатор необходимо временно отключать.RESET и +5V. Это предотвратит падение напряжения на линии сброса при поступлении сигнала от операционной системы.Для надежной промышленной эксплуатации (например, управления торговыми замками) оптимальным решением является постоянное удержание порта открытым через специализированную внешнюю компоненту 1С либо использование сетевых интерфейсов (Ethernet/Wi-Fi контроллеры с протоколом TCP/HTTP).