Привычка изобретать велосипеды не отпускает... Стало мало мне множества доступных терминальных программ для общения по последовательному порту со всякими железочками. Когда что-то делаешь с GSM-модемом, или с GPS-модулем, да чего там - даже с MP3-модулем, приходится многократно посылать команды в эти устройства и заниматься разбором ответов, от них приходящих. И, хотя до сих пор эти вопросы как-то решались, меня не оставляло чувство неудовлетворенности: слишком как-то все не просто, не элегантно, кривовато и не удобно. Ну, вот и решил сделать прямо, элегантно и удобно.
https://cloud.mail.ru/public/Audn%2F95Vd3Xz1j
Вот по этой ссылке лежат файлы бета-версии моей терминальной программки. Скачивать надо или все сразу, или, если трафика жалко, только EXE-шник. В последнем случае интерфейс будет на английском.
Чем моя программка лучше прочих? Ну, во-первых, она может практически все, что могут другие аналогичные программы. Во всяком случае всё то, что реально за долгие годы радиолюбительства мне было нужно делать. Во-вторых, она обладает рядом мелких приятностей, например, может отображать принятые и отправленные данные разным цветом.
Мелочь, а во многих других терминалках приходится вникать, что есть мои, а что чужие данные, особенно если они не текстовые, а бинарные...
Еще во время приема текста можно увидеть и невидимые символы, т.е. коды которых меньше кода пробела (табуляции там всякие и прочие переводы строк). Причем увидеть можно в разном представлении, по желанию. Например, вот так, как любят паскалисты (я из них):
А еще мой терминал умеет находить все имеющиеся в системе последовательные порты без того, чтобы в них срать (прошу пардону за мой французский). Большинство известных мне терминалок либо требуют вручную указать имя порта, а потом в лучшем случае ругнутся, что он отсутствует на самом деле, либо перебирают варианты сами, пытаясь открывать все подряд. Такие переборы почти всегда сопровождаются тем, что в "лишние" порты могут уйти какие-то данные, изменятся уровни на сигнальных линиях порта и т.п. неприятные явления могут возникать. Вот когда-то я делал приспособу, которая использовала сигнал RTS для включения настольной лампы по таймеру, и если кто-то вздумал бы определять наличие COM-порта путем его открывания-закрывания, лампочка бы стала мигать из-за этого.
Моя же программка может найти даже порты с именами, отличными от COM* (виртуальный нуль-модем com0com умеет такие создавать с легкостью), и при этом не гадит во все порты подряд. Кстати, работать с COM97 для моей программы так же просто, как и с COM1, а многие популярные терминалы вообще дальше COM4 не видят...
И еще один нюансик: моя программка по умолчанию сразу открывает выбранный порт, не требуя всяких кнопок "Подключить" и т.п., чем грешат абсолютно все другие терминалы. Но ведь если вы собрались с портом работать, он должен быть открыт - зачем же еще кнопки добавлять? Но, случаи бывают разные, и закрыть порт вы всегда сможете.
Чтобы повторить то, что уже было отправлено, не надо "программировать" какие-то макросы, настраивать кнопки или писать скрипты - всё, что вводится пользователем, попадает в историю и выглядит, как кнопка. Нажмешь на такую кнопку - и текст уйдет повторно. Часть данных на кнопке не видно, но что именно там "увнутре" (не неонка!), ясно по начальному кусочку (см. скриншот выше).
Кстати, заметили, что окошки можно склеивать в одно окно? Было окно текста без истории, а на тут стало с историей... Так это еще и не все - можно понаприклеивать их сколько угодно и куда угодно, забубенив интерфейс по-своему желанию! Хотите, чтобы все-все-все возможности программы были видны в одном окне? Пожалуйста:
На скриншоте вы видите 99% всех окошек, что существуют в программе, и все они склеены в одно большое "главное". Оставшийся процент - это окна плагинов, которые могут быть, а могут и не быть.
Вам кажется, что такой интерфейс слишком перегружен? Можно расчистить его, свернув "лишнее":
При этом стоит навести мышку на желтенькую полосочку - соответствующее окошко тут же развернется и позволит с собой поработать, а потом свернется и не будет мешать.
А если вы сторонник минимализма - можете оставить только самое нужное вам, например, окно HEX-данных и главное меню:
Если надо отправлять данные пакетами, то вводить их тоже можно предельно комфортно в таком оконце:
Это не фиксированные поля ввода, а заданные вот такой строкой "формата": Преамбула:\t%2xSender:\t\t%1xReciever:\t\t%1xCommand:\t%1dCRC:\t\t%2xEnd:\t\t%2x
Если изменить эту строку, например, так: Start:\t%2xSender:\t\t%1xReciever:\t\t%1xCommand:\t%1d, то и поля ввода данных тоже изменятся, соответственно, и пакет тоже будет другой:
Внимательный читатель наверняка заметит закономерную связь между полями ввода в окне и строкой формата: %1x означает поле ввода 1 байта в шестнадцатеричном формате, а %1u позволит ввести тот же байт в виде десятичного uint8_t. Само собой, int16_t вводится в поле %2d, а uint32_t в поле %4u. Можно и в двоичном виде: %4b. И так далее.
То есть в программе встроен редактор пакетов данных практически на все случаи жизни. Много ли известно альтернатив?
А еще ведь есть система фильтров! Каждый байт, поступающий на вход, может быть подвергнут разным проверкам, и пройдет на выход, т.е. появится в окне принятых данных, только в том случае, если все требования фильтров будут соблюдены. Например, классический старт-стопный пакет фиксированной длины выделить очень просто, при этом можно видеть только пакеты, в которых то или иное поле имеет конкретное значение, и не видеть остальные. Можно выделить только строки, начинающиеся с определенной последовательности символов, и т.п.
Без ложной скромности скажу, что благодаря фильтрам придумать формат презентации данных, который может потребоваться в работе, и который бы не смогла показать моя программка, будет сложновато. При помощи фильтра форматирования, работающего на том же принципе строки-формата, как уже было показано, поступающие на вход данные можно "смешивать" с текстовыми дополнениями, получая очень наглядную картину. Форматировать можно по 8, 16 и 32 бита и представлять это в десятичном (со знаком или без него), двоичном, восьмеричном или шестнадцатеричном виде. Формат строк для составления пакета на отправку и для просмотра принимаемого пакета, практически одинаков (разница в том, что в строке формата символ \n ведет себя по-разному). Вот пример того, как можно наблюдать приходящие байты в двоичном представлении:
Заметили окошко фильтра c параметром
Format? Вот я его меняю и - вуаля! - совсем иной коленкор:
И все эти фильтры реализованы в виде плагинов, т.е. не нужны - можно удалить и сэкономить несколько сотен килобайт места на диске. Понадобятся - можно в любой момент скачать и добавить.
Вот такой терминал моей мечты получается. Пока не без багов, но я близок к завершению. Помощников бы в поиске ошибок...
Такие дела...
P.S. скриншоты разные, потому что на разных компах делались, на одном еще Win7, на другом уже Win10. И -433 отфильтрованных байта не баг, а фича: форматирующий фильтр не режет, а дополняет данные, вот и выходит, что пришел 1 байт, а ушло 10, значит, отфильтровалось -9 :)
Комментарии
Отправить комментарий