Администрирование Windows Как посылать символы в COM-порт из командной строки Mon, October 07 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Как посылать символы в COM-порт из командной строки Печать
Добавил(а) microsin   

Мне часто нужно посылать короткие строки символов в последовательный порт на операционной системе Windows (перевод статьи [1]). Это можно использовать для отправки команд роботу или в другие устройства, основанным на микроконтроллерах. Для соединения с устройством можно использовать аппаратный преобразователь USB-to-serial, которые в обилии можно найти на сайтах AliExpress, Ebay и dx.com. Для отправки символов есть удобная утилита SerialSend [2], но также можно использовать встроенные команды Windows: echo, set и mode.

К примеру, нужно послать строку "hello" в COM1 (имя первого последовательного порта Windows). Для этого можно просто ввести в консоли cmd.exe следующую команду:

echo hello > COM1

Команда echo обычно используется для отображения строк в консоли командной строки, когда нужно вывести какое-нибудь информационное сообщение из скрипта команд *.BAT или *.CMD. Однако в этом примере с помощью символа > применено перенаправление вывода в специальный файл COM1, который в действительности не файл на диске, а последовательный порт. По этой причине строка "hello" отправляется в последовательный порт вместо экрана консоли.

Но для такого вывода текста в последовательный порт есть несколько препятствий:

• Нужно заранее знать номер COM-порта, который хотите использовать. Если Вы используете преобразователь USB-to-serial, то этот номер может неожиданно поменяться, особенно если Вы подключили его в другой разъем USB (программа SerialSend [2] предоставляет простой альтернативный метод отправки строк в любой доступный COM-порт с самым высоким порядковым номером, что может быть очень полезным).
• Строка, которая отправляется в нашем примере, в действительности имеет длину 8 байт, потому что она включает 1 байт завершающего пробела (код ASCII 0x20) плюс символ возврата каретки (CR, код 0x0D) и перевода строки (LF, код 0x0A).
• Отправлять можно только обычные символы текста. К примеру, произвольные байты с кодами 0x00 .. 0x19 отправлять не получится, на это способна только утилита SerialSend [2].
• Последовательный порт, который Вы хотите использовать, может быть настроен не на ту скорость, которая Вам нужна. В таком случае дополнительно нужно использовать команду mode, чтобы сконфигурировать скорость baudrate (и/или другие параметры фрейма последовательного протокола).
• COM-порты с большими номерами могут быть не распознаны для такого примера, но для их использования есть обходной маневр, описанный ниже.

Следующий пример - более надежный аналог команды из примера выше:

set /p x="hello" < nul >\\.\COM22

Эта команда может выглядеть поначалу довольно непонятной, давайте разберем её по частям.

Команда set обычно используется для установки значения для так называемой переменной окружения (environment variable). Например, следующая команда должна использоваться для установки переменной окружения с именем x в значение строки "sunshine":

set x="sunshine"

Когда в команде set используется ключ /p, то команда set выводит приглашение для пользователя, чтобы он ввел значение для устанавливаемой переменной окружения. Приглашение отображается на экране в виде строки, предоставленной в команде. Например:

set /p x="Введите значение для x: "

Конечно, нас в сущности не интересует установка значения переменной x как таковой, сейчас это просто средство для достижения другой цели. Все, что мы хотим - вывести строку "hello" без символов CR и LF, и команда set только лишь предоставляет способ для решения этой задачи.

Мы не хотим, чтобы команда set остановилась на ожидании ввода пользователя, чтобы он ввел значение для переменной x, для этого команда set перенаправлена на ввод из nul (т. е. нет ввода как такового, вместо обычного ввода, который обычно происходил бы из консоли). Это означает, что команда сразу завершит работу, вместо того, чтобы ожидать ввода пользователя. Перенаправление ввода осуществляется символом < , указанным перед nul.

set /p x="Enter a value for x: " < nul

Теперь, чтобы вывести только корректные символы, и только их, нам нужно перенаправить вывод в COM22. Чтобы гарантировать, что имя COM-порта будет правильно распознано, и произошло перенаправление вывода, здесь вместо специального системного имени используется его полная форма "\\.\COM22".

set /p x="hello" < nul > \\.\COM22

И наконец, чтобы сконфигурировать скорость перед отправкой строки в последовательный порт, можно использовать команду mode. Например, для настройки COM8 на 38400 бод, 8 бит данных, без проверочного бита четности, нужна следующая команда:

mode COM8 BAUD=38400 PARITY=n DATA=8

Вот полный пример на скриншоте окна консоли:

Windows send symbols COM port via cmdline

[Ссылки]

1. Simple command line trick for sending characters to a serial port in Windows site:batchloaf.wordpress.com.
2. SerialSend: утилита для работы с виртуальным COM-портом.

 

Комментарии  

 
0 #2 Павел 20.05.2019 09:37
Цитирую Андрей:
Как можно отправить через оболочку CMD четкую битовую последовательно сть, описанную 16-ричным кодом? Мне надо послать на Modbus-совместимое устройство последовательно сть бит, а потом прослушать с него ответ. Я попытался через код вида:
"set /a x=0xAA01025800000105
echo %x% > .COM22
type .COM22>output.txt"
Смысл кода в том, что-бы отправить в COM-порт последовательно сть байтов, которые описываются кодом AA 01 02 58 00 00 01 05, после чего устройство пришлет мне ответ, который я прочитаю. Но что бы я ни делал, на порт отправляется не то что нужно. Вы бы не могли мне подсказать что надо делать.

Вы пытаетесь послать строку ASCII текста, а вам нужен hex код, судя по всему. Попробуйте Serialsend с соответствующим параметром.
Цитировать
 
 
+3 #1 Андрей 01.05.2018 14:45
Как можно отправить через оболочку CMD четкую битовою последовательно сть, описаную 16-ричным кодом? Мне надо послать на Modbus-совместимое устройство последовательно сть бит, а потом прослушать с него ответ. Я попытался через код вида:
"set /a x=0xAA01025800000105
echo %x% > \.COM22
type \.COM22>output.txt"
Смысл кода в том что-бы отправить в COM-порт последовательно сть байтов, которые описываются кодом AA 01 02 58 00 00 01 05, после чего устройство пришлет мне ответ, который я прочитаю. Но что бы я ни делал, на порт отправляется не то что нужно. Вы бы не могли мне подсказать что надо делать.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page