Чтение из COM-порта в переменную в командной строке Windows
Всем привет!
Хочу принимать и обрабатывать данные от Ардуино в bat-скрипте. Данные представляют собой строку, заканчивающуюся \r\n. Посылаются каждые 5 секунд. Есть ли способ поместить их в переменную в этом же скрипте без промежуточного файла?
Пробую такой код:
@ ECHO OFF
MODE COM5 BAUD=9600 PARITY=n DATA=8 > nul
FOR /F "usebackq" %%i IN (`TYPE COM5`) DO set x=%%i
ECHO Data=%x%
и ничего не происходит, команда FOR просто бесконечно ждет данные от команды TYPE COM5.
Пробовал также:
FOR /F "usebackq" %%i IN (`TYPE COM5 ^> CON`) DO set x=%%i
FOR /F "usebackq" %%i IN (`COPY COM5 CON`) DO set x=%%i
FOR /F "usebackq" %%i IN (`TYPE COM5 ^> CON ^| FIND /V "notmydata"`) DO set x=%%i
Данные отображаются на экране, но скрипт как бы крутится внутри команды TYPE, и переход к DO не происходит.
Перерыл весь интернет, все советуют Powershell, который прекрасно с задачей справляется. Но ради спортивного интереса и расширения кругозора хочется сделать именно на чистом CMD и без временных файлов.
Ответы (2 шт):
Ваш цикл будет крутиться бесконечно, поскольку COM5 как файл никогда не закончится. Попробуйте читать построчно
@echo off
MODE COM5 BAUD=9600 PARITY=n DATA=8 > nul
FOR /F "usebackq" %%i IN (`TYPE COM5`) DO (
ECHO Data=%%i
goto break
)
:break
Проблема останется с тем, что если из порта читать нечего, батник будет висеть и ждать данные
Удалось добиться помещения данных из COM-порта в переменную при небольшом изменении пакета данных от Ардуино.
Если пакет заканчивается не на \r\n, а на (char)26 — символом конца файла, то для чтения из COM-порта можно использовать команду SORT.
@ ECHO OFF
MODE COM5 BAUD=9600 PARITY=n DATA=8 > nul
ECHO Listening port
:start
FOR /F "usebackq" %%i IN (`SORT^<COM5`) DO ( set x=%%i)
ECHO x=%x%
timeout /t 1 /nobreak
goto start