Как я знаю, что программа вышла, с точки зрения последовательной консоли - PullRequest
2 голосов
/ 08 января 2010

У меня есть программа, которая связывается через последовательный порт с целью. Вероятно, целью является оболочка или похожая программа. В случае, если я хочу отправить несколько команд на цель, как я могу знать, что команда окончена, чтобы я мог отправить следующую команду?

У меня были некоторые идеи, например, перехватить приглашение оболочки или позволить команде вывести текст перед выходом. Но это увеличит сложность. Я хотел бы знать, есть ли какой-то другой более простой метод для достижения этого.

Ответы [ 3 ]

2 голосов
/ 08 января 2010

Если вы отправляете команды программе-оболочке, которая возвращает приглашение, скажите «$» после отправки команды, тогда вы, безусловно, можете подождать, пока не увидите «$», перед отправкой следующей команды. Это очень простой протокол, но он должен работать просто отлично.

Чтобы не беспокоиться о том, что "$" находится в отраженных данных с консоли, отключите эхо-сигнал на консоли или измените подсказку на что-то маловероятное, чтобы быть в отраженных данных.

Технически вы можете использовать консольный буфер ввода (typeahead), отправляя пакет команд с длиной, меньшей длины входного буфера (вы должны это проверить), например cmd1 [cr] cmd2 [cr] cmd3 [cr ], но не отправляйте больше, пока не вернетесь [cr] $ [cr] $ [cr] $. [Cr] может потребоваться [cr] [lf], а «$» может фактически быть «$» в зависимости от того, как работает консоль.

С включенным XONN / XOFF вы можете технически проверить, чтобы XOFF прекратил отправку, а затем возобновить, когда вы видите XONN, но я бы не рекомендовал это делать, если вы отправляете на консоль команд. Вам нужно убедиться, что буфер XONN / XOFF соответствует входному буферу консоли, и это действительно будет сложнее.

2 голосов
/ 08 января 2010

Было бы невозможно узнать, завершилась ли команда, если информация не вернется к агенту, выдающему команды с каким-либо указанием завершения. Рассмотрим, как работает терминал * nix. Терминал * nix был разработан точно для такой же ситуации - выдача удаленных команд на другой ПК через какой-то канал. В таком случае, как пользователь узнает, что он может набрать другую команду? В случае по умолчанию, он дает вам знать, что это сделано, предлагая вам ввести другую команду. В крайнем случае он позволяет получить ветвь процесса из оболочки, в которой вы получите указание на то, что задание завершено.

Кажется, самое простое решение - повторить что-то вроде «<< cmd >> complete».

Какой-то базовый псевдокод

 for (command in commands)
 {
     IssueCommand(command);
     result = "";
     while (result != "complete")
     {
         // read serial port append to result
         result += read(serialPort);
     }
 }
0 голосов
/ 08 января 2010

Один из подходов, который вы можете использовать, - это испускание какого-либо маркера, такого как байт EOF. Проверьте все входящие байты, чтобы увидеть, являются ли они байтами EOF. Вы также можете выбрать другой байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...