Как из командной строки осуществить открытие, чтение и запись в COM-порт Windows?
У меня стоит задача мониторинга и управления ИБП АРС, подключенного к удаленной ПЭВМ через COM-порт RS232. Как работать с COM-портом на локальной ПЭВМ и осуществить мониторинг и управление ИБП АРС я знаю. А также я знаю как подключиться (через WMI или Telnet) к удаленной ПЭВМ и запустить и запустить задачу и исполнить её в консольном режиме. На удаленной ПЭВМ я не могу устанавливать своего ПО, т.е. мне необходимо пользоваться стандартными средствами Windows. А на ПЭВМ где производиться мониторинг (локальная) я хозяин, поэтому моя задача узнать как стандартными средствами Windows манипулировать COM-портом (а значит ИБП АРС) на удаленной ПЭВМ, а результаты получать и обрабатывать на локальной ПЭВМ (где мониторинг). Слышал я, что есть возможность удаленно манипулировать COM-портом можно через WMI, но я не знаю как.
Отслеживать
32.1k 19 19 золотых знаков 79 79 серебряных знаков 106 106 бронзовых знаков
задан 4 апр 2015 в 8:46
71 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
ru.stackoverflow.com/questions/413530. Я вам уже отвечал
4 апр 2015 в 8:55
На удаленную ПЭВМ я не могу устанавливать свои программы, поэтому я могу использовать только стандартные средства Windows.
4 апр 2015 в 9:21
Никак. Удалённый компьютер должен сотрудничать, то есть, там должна бежать либо ваша, либо ещё чья-то программа (по сути, сервер), которая по вашему запросу выполнит нужные действия.
6 апр 2015 в 19:58
Это не обязательно. Первый вариант: Можно подцепиться через WMI к удаленной ПЭВМ (предварительно запустив соответственную службу см. Попов Андрей, Шикин Е. А Администрирование Windows с помощью WMI и WMIC) и делать запросы WMI) а затем их обрабатывать на локальной ПЭВМ. Второй вариант: через Telnet и выполнять консольные команды(CMD) и получать результаты исполнения команд, а затем их обрабатывать на локальной ПЭВМ (предварительно запустив службу Сервер Telnet). Т.е. серверами на удаленной ПЭВМ будут Сервер WMI или Сервер Telnet.
7 апр 2015 в 11:32
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
В командной строке Windows есть возможность обращаться к COM-порту по имени вида COMx , где x — номер порта. Эта возможность пришла ещё из MS DOS.
Например, для отправки текста «123» устройству можно воспользоваться командой
echo 123 > COM1
В порт будут отправлены байты, содержащие коды символов из параметра команды echo .
Для указания параметров порта можно воспользоваться командой mode . Пример использования:
mode COM1 BAUD=9600 PARITY=n DATA=8
Это означает, что порт COM1 работает со скоростью 9600 бод, передаёт данные по 8 бит и не использует проверку чётности.
Судя по тегам, вы можете использовать C#. В этом случае просто воспользуйтесь классом SerialPort из пространства имён System.IO.Ports . Однако этот класс позволяет работать с портом лишь на локальной машине.
Если вам требуется сложное поведение, то вы можете из командной строки удалённо создать файл с программой на C# и скомпилировать его утилитой csc.exe при условии, что на удалённой машине установлена платформа .NET (консольный компилятор входит в комплект её поставки).
Возможно есть и другие средства для удалённой работы с оборудованием машины, которые вам лучше подойдут. Например, если установлен PowerShell, то можно воспользоваться его возможностями.
PS> [System.IO.Ports.SerialPort]::getportnames() COM3 PS> $port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one PS> $port.open() PS> $port.WriteLine("Hello world") PS> $port.Close()
PS> $port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one PS> $port.Open() PS> $port.ReadLine()
Пример работы с портом из VBScript (к сожалению, не было возможности проверить на реальном железе).
Dim port, fso ' Константы для режимов работы с файлом Const ForAppending = 8 ' Объект для работы с файлами Set fso = CreateObject("Scripting.FileSystemObject") ' Открываем порт для записи Set port = fso.OpenTextFile("COM4:9600,N,8,1", ForAppending) ' Запись строки port.Write "test" ' См. также WriteLine ' Закрываем порт port.Close
Dim port, fso ' Константы для режимов работы с файлом Const ForReading = 1 ' Объект для работы с файлами Set fso = CreateObject("Scripting.FileSystemObject") ' Открываем порт для чтения Set port = fso.OpenTextFile("COM4:9600,N,8,1", ForReading) ' Если не конец потока данных if not port.AtEndOfStream then ' Выводим строку msgbox port.ReadAll ' См. также .Read и .ReadLine end if ' Закрываем порт port.Close
Определение номера подключенного COM порта
Для правильного подключения оборудования, необходимо определить номер COM порта.
Проверка проводится при условии, что сервер полностью развернут, и работает заведомо правильно.
Windows
Для определения номера COM порта на ОС Windows необходимо:
- Убедиться в том, что многожильный кабель подключен к COM-порту
- Перейти в «Диспетчер устройств», расположенный в: Панель управления\Оборудование и звук\Диспетчер устройств (необходимы права администратора)
- Раскрыть дерево «Порты (COM и LPT)»
- Отсоединить многожильный кабель
- Запомнить изменения в дереве устройств «Порты (COM и LPT)»
- Присоединить многожильный кабель обратно к COM-порту
- Найти новый порт в дереве устройств «Порты (COM и LPT)»

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

Linux
Для определения номера COM порта на ОС Linux необходимо:
- Обладать правами Root либо пользователь должен входить в группу dialout
- Убедиться в том, что многожильный кабель подключен к COM-порту
- Проверить наличие COM портов в системе, введя в командную строку следующую команду:
ls -l /dev/ttyS* /dev/ttyUSB*
4. После выполнения команды отобразится список всех доступных COM-портов

dev/ttyS0 — первый COM порт
/dev/ttyS1 — второй COM порт
/dev/ttyUSB0 — специальный кабель-переходник из USB в COM (Gembird UAS111)
5. Установить программу minicom. Для этого вводим следующую команду:
apt-get install minicom
6. Найти многожильный кабель в оплётке длиной 4-6 см.
7. Соединить 2 и 3 выводы COM порта перемычкой из кусочка многожильного провода. Оплётка будет удерживать провод на контактах, а металлические жилы внутри будут проводниками.
8. Настроить программу minicom. Для этого вводим следующую команду:
minicom -s

9. Выбрать «Настройка последовательного порта»

10. Нажимая А поочередно выбираем порты (если используется кабель-переходник из USB в COM то выбрать /dev/ttyUSB0)
11. Отключить аппаратное управление потоком, нажав «F»
12. Выйти из настроек нажав «Enter»
13. Сохранить настройки по умолчанию «Сохранить настройки как dfl»
14. Выйти из minicom
15. Запустить minicom выполнив команду:
minicom
16. Нажать на любую клавишу на клавиатуре

В случае, если символы не вводятся с клавиатуры, необходимо вернуться к пункту 10, и выбрать другой COM-порт
Если вводимые символы отображаются — значит COM-порт определен верно
17. После того, как номер COM-порта определен его необходимо указать в схеме SCADA, для устройства, подключенного многожильным кабелем.
CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Возникла задача читать данные из COM-порта, во что я и уткнулся. Хотелось бы реализовать всё штатными средствами командной строки.
Записать в порт — никаких проблем, тот же «echo Hello>COM1»
Что касается чтения, всё что смог нагуглить — это либо copy, либо set.
copy - виснет, если во входном потоке нет символа конца файла (а у меня его как раз нет)
set /p "input_str="
Также попытался сделать костыль через CMD+JScript, записав файл с js-кодом и вызвав его исполнение через cscript.exe.
Однако и там упёрся, ибо не удалось прочитать ничего из файла ни с помощью ReadLine, ни с помощью побайтового чтения Read(1) (открывал в текстовом режиме файл "COM1:57600,N,8,1")
В общем не удалось штатными средствами прочитать никак.
А тащить сторонние утилиты или всякий activex типа mscomm совсем не хочется.
Есть ли какие-то решения ?
2 Ответ от shiz 2016-10-19 20:49:09










Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Может быть, COPY /B ?
Забыл пароль и потерял e-mail.
3 Ответ от Himmler 2016-10-19 22:02:30
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Я это тоже пробовал, бинарность файла не отменяет поиска его конца. Точно так же виснет.
4 Ответ от DnsIs 2016-10-20 09:09:05 (изменено: DnsIs, 2016-10-20 09:11:15)
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
А если: type COM1 ?
А еще в инете полно ссылок на примеры скриптов для Power Shell
Нас невозможно сбить с пути, нам пофигу куда идти.
5 Ответ от Himmler 2016-10-20 10:58:08
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Нет, type тоже хочет символ конца файла.
Касательно Power Shell, если я не путаю, его вмазанная поддержка появилась с Windows 7, а значит метод не будет работать на машинах с XP (а это критично).
6 Ответ от DnsIs 2016-10-20 14:35:49 (изменено: DnsIs, 2016-10-20 14:36:10)
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Ладно Power Shell, тяжелый. Неужели не найдется места для небольшой утилиты?
ЗЫ Например putty.
Нас невозможно сбить с пути, нам пофигу куда идти.
7 Ответ от Himmler 2016-10-20 16:07:15
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Да дело не в занимаемом месте, а в стороннем исполняемом файле. Именно поэтому не хочу тащить на машину к пользователю левых утилит\компонентов.
8 Ответ от DnsIs 2016-10-21 08:27:35
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Тогда HyperTerminal.
Правда ХЗ как его в скрипт вкрутить
Нас невозможно сбить с пути, нам пофигу куда идти.
9 Ответ от Himmler 2016-10-21 11:03:19
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Его нет в Windows 7, и скрипт туда вряд ли прикрутишь.
Пока что в голову приходит только написание коротенького (байт 50) com-файла для вычитывания байта из порта и его вывода на экран. А хранить этот com-файл внутри текста bat-файла с последующей записью на диск и исполнением из bat-файла.
Не знаю только как работают com-файлы на досовской виртуальной машине в Windows 7 (а именно разрешён ли доступ к портам).
10 Ответ от DnsIs 2016-10-21 12:35:45
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
А так:
TYPE COM2>CON
Нас невозможно сбить с пути, нам пофигу куда идти.
11 Ответ от Himmler 2016-10-21 15:15:50
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Ну какая разница, виснет же type. Нет там символа конца файла.
12 Ответ от DnsIs 2016-10-21 15:31:30 (изменено: DnsIs, 2016-10-22 09:26:01)
Re: CMD/BAT: Чтение из COM-порта штатными средствами командной строки
Специально установил программу Virtual Serial Ports Emulator. Прокинул мост между 2 виртуальныи портами. В одном окне
echo bla-bla-bla>COM2
в другом
TYPE COM3
И ничего.
А вот если
TYPE COM2>CON
или
TYPE COM2>output-file
То все получается.
Пробовал и Hyper terminal и putty. Мне кажется что все они работают одинаково.
И без символа конца строки, никакая программа ничего не поймает.
Тут сниффер какой то нужен. Думаю в арсенале win таких не найдется.
PS Вчера каждая строка (echo bla-bla-bla>COM2) прилетала в COM4 мгновенно. А сегодня только после переполнения буфера (то есть при многократном вызове (echo bla-bla-bla>COM2))
Очистка занятых COM портов в Windows

02.02.2022

itpro

PowerShell, Windows 10, Windows 7, Windows Server 2019

комментариев 26
Когда вы подключаете к компьютеру новое COM или некоторые USB устройства (например, USB модем, мобильный телефон, Bluetooth адаптер, конвертеров последовательных портов в USB и т.п.), Windows определяет его через механизм Plug-n-Play и назначит ему номер COM порта в диапазоне от 1 до 255 (COM1, COM2, COM3 и т.д.). При повторном подключении этого же устройств, ему назначается номер COM порта (Communication Port, или Serial port), зарезервированный за ним ранее. Новым устройствам выдается первый незанятый номер COM порта. Не редкость, когда внешние устройства при подключении создают сразу несколько COM портов (в моем случае после подключения адаптера Bluetooth, в системе появилось сразу 10 . новых COM портов).
Ряд приложений (как правило, довольно древних), способны адресовать только двухзначные номера COM портов, и отказываются работать с COM100 и выше. Или видят только COM1-COM9 устройства. Что делать, если подключенное устройство получило высокий номер COM порта? Можно ли сбросить нумерацию для зарезервированных COM портов и удалить назначенные порты?
Изменить номер COM порта устройства в Windows
В Windows можно вручную изменить номер COM порта, назначенный устройству. Предположим требуемый COM порт уже занят, и мы хотим его попробовать его освободить. Для этого:
- Откройте диспетчер устройств (Device Manager) командой devmgmt.msc;
- В меню выберите View->Show Hidden Devices;

- Затем разверните Ports (COM & LPT) и найдите в списке устройство;
- Перейдите на вкладку Port Settings и нажмите кнопку Advanced;
- Текущий номер COM порта, назначенный устройству указан в поле COMPortNumber;
- Чтобы изменить его, раскройте выпадающий список и выберите номер COMпорта, который хотите задать.

Но чаще всего изменить номер COM порт на другой не получится, так как все «низкие» COM порт уже используются (in use);


Однако такой способ позволяет освободить занятый COM порт не во всех случаях.
Вы можете вывести полный список занятых COM портов в Windows с помощью PowerShell:
Get-WMIObject Win32_SerialPort | Select-Object Name,DeviceID,Description
Можно определить номер COM порта для определённого устройства по его имени, например:
Get-WMIObject Win32_SerialPort | Where-Object < $_.Name -like "*Arduino*">|select name, deviceid
Или
Get-WMIObject Win32_SerialPort | Where-Object < $_.Name -like "*GPS*">|select name, deviceid
Определяем процесс, который использует COM в Windows
Вы не сможете освободить COM порт устройства, которое используется Windows или запущенной программой, процессом. Сначала вам нужно завершить процесс/программу, которая использует сейчас COM порт. Чтобы определить имя процесса, который использует COM порт понадобится утилита Process Explorer (https://docs.microsoft.com/en-gb/sysinternals/downloads/process-explorer).
Сначала нужно вывести имя службы, которая использует COM порт. Выполните команду PowerShell:
get-pnpdevice -class Ports -ea 0| Select Name, PNPDeviceID, Status, Service

Имя службы данного COM порта указано в столбце Service. Например, для COM2 это Serial. Теперь нужно запустить Process Explorer с правами администратора и выбрать в меню Find -> Find Handle or DLL. В строке Hangde or DLL substring введите значение Service, полученное ранее. В нашем примере это Serial .
Process Explorer должен показать процесс, который использует сейчас ваш COM порт. Чтобы освободить COM порт, завершите процесс или программу.

Сброс назначенных COM портов Windows через реестр
Информация об используемых COM портах хранится в ключе реестра CommDB в разделе HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter
-
Откройте редактор реестра (regedit.exe) и перейдите в указанную ветку.
Важно! Настоятельно рекомендуем предварительно создать резервную копию данной ветки реестра (File -> Export). В том случае, если что-то пойдет не так, вы сможете вернуться к первоначальной конфигурации COM портов.

Значение параметра ComDB в двоичном формате определяет список COM портов, зарезервированных в системе. Каждый бит определяет состояние соответствующего порта (от 1 до 255). К примеру, если нам нужно оставить резервацию только для COM3, hex значение ComDB будет равно 04 (0000 0100);
Важно! Будьте предельно внимательными, ни в коем случае не добавьте в этот параметр дополнительные байт, иначе система может начать падать в BSOD.

Если нужно полностью сбросить все привязки COM, измените значение ключа ComDB на 0.

Примечание. В разделе HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM можно увидеть полный список COM портов, доступных в Windows.В разделе HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM можно увидеться список COM портов, подключенных к системе.

Также вы можете использовать следующие две бесплатные утилиты для очистки занятых (In Use) COM портов:

- COM Name ArbiterTool – утилита для освобождения занятых COM портов. Запустите утилиту с правами администратора, выберите COM порты, которые вы хотите освободить и нажмите Clear unused Reservationsи Remove non-present devices;
- Device Cleanup Tool – утилита используется для поиска в реестре информации о ранее подключенных устройств (в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum) и удаления неиспользуемых устройств и очистки резерваций COM портов.
Предыдущая статья Следующая статья