Трубопроводный выход последовательного порта для скручивания для цикла for в cmd - PullRequest
1 голос
/ 11 ноября 2019

Я хотел бы получить выход последовательного порта. Через него отправлено сообщение в UTF-8.

Теперь мне нужно отправить это сообщение, полученное через последовательный порт, на HTTP-API с CURL.exe

Сначала я попытался открыть порт в cmd с типом com5:». Это работало нормально, и порт был открыт и контролировался. Я видел сообщение в cmd, и когда я использовал «type com5: >> output.txt», сообщение было записано в файл.

После этого я попытался поместить команду "type com5:" - в цикл for в cmd для отправки сообщения при получении CURL в API.

Код, который я использовал:

cd C:\comcon\
for /F %%i in ('type com5:') do set message=%%i & curl.exe http://sample.com/api.php?message=%message%

С этим кодом он не работает. Сообщения, полученные через последовательный порт, не обрабатываются внутри цикла for, и кажется, что цикл даже не запущен.

У любого есть идея или другое решение для отслеживания последовательных портов на наличие новых сообщений и отправки этих сообщений в API посредством вызова URL с параметрами.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 11 ноября 2019

Я бы использовал два потока.
Один для получения сообщения от com-порта и один для его обработки.
Это позволяет избежать блокировки FOR /F. Но вам придется убить первый поток, потому что он не может быть остановлен автоматически.

@echo off
REM *** Trampoline jump for function calls of the form ex. "C:\:function:\..\<batch>.bat"
FOR /F "tokens=3 delims=:" %%L in ("%~0") DO goto :%%L

break > async.tmp

start "" /b %~d0/:thread_read:/../%~pnx0

goto :process
exit /b

:thread_read
echo STARTING
type com5_ > async.tmp
echo END THREAD
exit

:process
setlocal EnableDelayedExpansion
call :_process  < async.tmp
exit /b

:_process
set "line="
set /p line=
if not defined line (
    goto :_process
)

echo ## !line!
...