Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 7 (http://forum.oszone.net/forumdisplay.php?f=95)
-   -   Работа с COM-портом из консоли (http://forum.oszone.net/showthread.php?t=350839)

abudaba 11-03-2022 00:22 2981439

Работа с COM-портом из консоли
 
Доброго времени суток!

Решил поработать с 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 2981447

Решил проверить, на чьей стороне проблема. Оказалось, проблема не на передающей, а на принимающей стороне.

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

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

Angry Demon 11-03-2022 10:33 2981454

abudaba, а если уменьшить буфер приёма?

abudaba 11-03-2022 19:17 2981496

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

Ё

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

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


Время: 23:47.

Время: 23:47.
© OSzone.net 2001-