PDA

Показать полную графическую версию : Работа с COM-портом из консоли


abudaba
11-03-2022, 00:22
Доброго времени суток!

Решил поработать с COM-портом из консоли и столкнулся со следующей проблемой.

Есть два порта: COM1 и COM2 с нуль-модемным соединением. Если начать отправлять данные в любой из портов при помощи команд type или echo, то на второй порт данные приходят не сразу, а с запозданием в 512 байт. Т.е. где-то есть какой-то 512-байтный буфер, который пока не заполнится, данные не отправятся. И как следсвие, данные на второй порт пересылаются строго 512-байтными блоками, поэтому если объём пересылаемых данных не кратен 512 байтам, то часть данных попросту не дойдёт, осев в том самом буфере.

Вопрос: как это можно исправить, чтобы, отправляя 1 байт, он тут же пересылался?

Первая консоль:
echo Hello! > COM1
Вторая консоль:
type COM2

Есть подозрение, что это как-то связано с синхронным/асинхронным режимом работы порта. Но это не точно.

P.S. Перед пересылкой данных я, понятное дело, отключил тайм-аут для порта COM2 (т.е. включил режим монитора).
mode COM2 to=off

abudaba
11-03-2022, 04:23
Решил проверить, на чьей стороне проблема. Оказалось, проблема не на передающей, а на принимающей стороне.

Так, подключившись к COM2 порту терминалом, обнаружил, что все посылаемые в COM1 байты тут же выводятся безо всяких проблем. Значит, дело в буфере (размере блока) команды type. Получается, type выводит инфу блоками по 512 байт...

Вопрос: можно ли это как-нибудь обойти?

Angry Demon
11-03-2022, 10:33
abudaba, а если уменьшить буфер приёма?
https://i.ibb.co/mNtM7ZQ/com.png (https://ibb.co/mNtM7ZQ)

abudaba
11-03-2022, 19:17
Angry Demon, к сожалению, от этого команда type не перестаёт читать и/или писать 512-байтными блоками...

В общем, штатными средствами винды решить это пока что не удалось. Пришлось прибегнуть к помощи сторонней утилиты dd и выставить в ней размер блока в 1 байт:

Консоль 1:
echo Ё > COM1

Консоль 2:
dd bs=1 if=COM2 of=CON
или
dd bs=1 if=COM2 > CON
или
dd bs=1 if=\\.\COM2 > CON
или
dd bs=1 if=\\?\COM2 > CON
или
dd bs=1 if=\??\COM2 > CON

Ё
Теперь всё работает, как должно, если не считать в сотни раз более низкой скорости передачи данных (шутка ли - читать и писать по одному байту...).

Но, конечно, хотелось бы решить этот вопрос штатными средствами винды.




© OSzone.net 2001-2012