Jump to content
  • entries
    21
  • comments
    135
  • views
    2214

Терминал моей мечты

ARV

1616 views

Привычка изобретать велосипеды не отпускает... Стало мало мне множества доступных терминальных программ для общения по последовательному порту со всякими железочками. Когда что-то делаешь с GSM-модемом, или с GPS-модулем, да чего там - даже с MP3-модулем, приходится многократно посылать команды в эти устройства и заниматься разбором ответов, от них приходящих. И, хотя до сих пор эти вопросы как-то решались, меня не оставляло чувство неудовлетворенности: слишком как-то все не просто, не элегантно, кривовато и не удобно. Ну, вот и решил сделать прямо, элегантно и удобно.

https://cloud.mail.ru/public/Audn%2F95Vd3Xz1j

Вот по этой ссылке лежат файлы бета-версии моей терминальной программки. Скачивать надо или все сразу, или, если трафика жалко, только EXE-шник. В последнем случае интерфейс будет на английском. 

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

image.png.5102ababd13d0e8ac2e7aae085a7b907.png    image.png.927883683c713cbc897835fcf7a70a2c.png

Мелочь, а во многих других терминалках приходится вникать, что есть мои, а что чужие данные, особенно если они не текстовые, а бинарные...

Еще во время приема текста можно увидеть и невидимые символы, т.е. коды которых меньше кода пробела (табуляции там всякие и прочие переводы строк). Причем увидеть можно в разном представлении, по желанию. Например, вот так, как любят паскалисты (я из них):

image.png.a621aae0c5a7f326da939035f2d67ad8.png

А еще мой терминал умеет находить все имеющиеся в системе последовательные порты без того, чтобы в них срать (прошу пардону за мой французский). Большинство известных мне терминалок либо требуют вручную указать имя порта, а потом в лучшем случае ругнутся, что он отсутствует на самом деле, либо перебирают варианты сами, пытаясь открывать все подряд. Такие переборы почти всегда сопровождаются тем, что в "лишние" порты могут уйти какие-то данные, изменятся уровни на сигнальных линиях порта и т.п. неприятные явления могут возникать. Вот когда-то я делал приспособу, которая использовала сигнал RTS для включения настольной лампы по таймеру, и если кто-то вздумал бы определять наличие COM-порта путем его открывания-закрывания, лампочка бы стала мигать из-за этого.

Моя же программка может найти даже порты с именами, отличными от COM* (виртуальный нуль-модем com0com умеет такие создавать с легкостью), и при этом не гадит во все порты подряд. Кстати, работать с COM97 для моей программы так же просто, как и с COM1, а многие популярные терминалы вообще дальше COM4 не видят...

И еще один нюансик: моя программка по умолчанию сразу открывает выбранный порт, не требуя всяких кнопок "Подключить" и т.п., чем грешат абсолютно все другие терминалы. Но ведь если вы собрались с портом работать, он должен быть открыт - зачем же еще кнопки добавлять? Но, случаи бывают разные, и закрыть порт вы всегда сможете.

 image.png.7095ff7de798f8b2d751f06be8da2460.png

Чтобы повторить то, что уже было отправлено, не надо "программировать" какие-то макросы, настраивать кнопки или писать скрипты - всё, что вводится пользователем, попадает в историю и выглядит, как кнопка. Нажмешь на такую кнопку - и текст уйдет повторно. Часть данных на кнопке не видно, но что именно там "увнутре" (не неонка!), ясно по начальному кусочку (см. скриншот выше).

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

image.png.3579a4c3053d075d8d5beeff04817973.png

На скриншоте вы видите 99% всех окошек, что существуют в программе, и все они склеены в одно большое "главное". Оставшийся процент - это окна плагинов, которые могут быть, а могут и не быть.

Вам кажется, что такой интерфейс слишком перегружен? Можно расчистить его, свернув "лишнее":

image.png.d620f1f9a56969313a345e47a87abcb7.png

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

А если вы сторонник минимализма - можете оставить только самое нужное вам, например, окно HEX-данных и главное меню:

image.png.1a5619f18022c471ca80bf2048db8d53.png

Если надо отправлять данные пакетами, то вводить их тоже можно предельно комфортно в таком оконце:

image.png.49b808cb0d41847b3a5493ef4e552c34.png

Это не фиксированные поля ввода, а заданные вот такой строкой "формата": Преамбула:\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, то и поля ввода данных тоже изменятся, соответственно, и пакет тоже будет другой:

image.png.fa7f79cdfc7506919c4c91bdf481d0bc.png

Внимательный читатель наверняка заметит закономерную связь между полями ввода в окне и строкой формата: %1x означает поле ввода 1 байта в шестнадцатеричном формате, а %1u позволит ввести тот же байт в виде десятичного uint8_t. Само собой, int16_t вводится в поле %2d, а uint32_t в поле %4u. Можно и в двоичном виде: %4b. И так далее.

То есть в программе встроен редактор пакетов данных практически на все случаи жизни. Много ли известно альтернатив?

А еще ведь есть система фильтров! Каждый байт, поступающий на вход, может быть подвергнут разным проверкам, и пройдет на выход, т.е. появится в окне принятых данных, только в том случае, если все требования фильтров будут соблюдены. Например, классический старт-стопный пакет фиксированной длины выделить очень просто, при этом можно видеть только пакеты, в которых то или иное поле имеет конкретное значение, и не видеть остальные. Можно выделить только строки, начинающиеся с определенной последовательности символов, и т.п.

Без ложной скромности скажу, что благодаря фильтрам придумать формат презентации данных, который может потребоваться в работе, и который бы не смогла показать моя программка, будет сложновато. При помощи фильтра форматирования, работающего на том же принципе строки-формата, как уже было показано, поступающие на вход данные можно "смешивать" с текстовыми дополнениями, получая очень наглядную картину. Форматировать можно по 8, 16 и 32 бита и представлять это в десятичном (со знаком или без него), двоичном, восьмеричном или шестнадцатеричном виде. Формат строк для составления пакета на отправку и для просмотра принимаемого пакета, практически одинаков (разница в том, что в строке формата символ \n ведет себя по-разному). Вот пример того, как можно наблюдать приходящие байты в двоичном представлении:

image.png.7b30b6c67f3e44071e1ed3793bf7a713.png

Заметили окошко фильтра c параметром Format? Вот я его меняю и - вуаля! - совсем иной коленкор:

image.png.bad5e187d9b3ddfcb0075157b58b2493.png

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

Вот такой терминал моей мечты получается. Пока не без багов, но я близок к завершению. Помощников бы в поиске ошибок...

Такие дела...

P.S. скриншоты разные, потому что на разных компах делались, на одном еще Win7, на другом уже Win10. И -433 отфильтрованных байта не баг, а фича: форматирующий фильтр не режет, а дополняет данные, вот и выходит, что пришел 1 байт, а ушло 10, значит, отфильтровалось -9 :) 

  • Like 2
  • Upvote 5


28 Comments


Recommended Comments



8 часов назад, mazzi сказал:

Попробую и отпишусь о впечатлениях

Ну вы постарайтесь не затягивать с впечатлениями, как с вашим PLC :) Все-таки хочется получить реакцию, чтобы понять, в каком направлении двигаться.

Share this comment


Link to comment
19 минут назад, ARV сказал:

Ну вы постарайтесь не затягивать с впечатлениями, как с вашим PLC :) Все-таки хочется получить реакцию, чтобы понять, в каком направлении двигаться.

В понедельник попробую.

А PLC мой уже внедряется в производство. Уже клиенты заказали три десятка. Присоединяйтесь, если есть желание.

Share this comment


Link to comment
2 часа назад, mazzi сказал:

Присоединяйтесь, если есть желание.

Моё желание не имеет значения, если у вас нет желания делать ТЗ.

Share this comment


Link to comment

Зарелизил первую версию :)

Обновлена справочная система - теперь полностью описывает все, что сделано, можно использовать, как документацию. И для плагинов тоже в том числе.

Исправил несколько ошибок, внес небольшие изменения.

Кто уже успел скачать предыдущую бету - перескачайте все.

Подробности см. в файле history_FTerm.txt

Share this comment


Link to comment

Еще раз благодарю! 

Увы, у меня на рабочем ноутбуке стала барахлить клавиатура, иногда не пропечатываются клавиши "Ы", "Я", "Д", "Л" и "Ж", так что это наверняка не последняя опечатка :( 

Share this comment


Link to comment

ещё

err3.png.f82739e3c90b7afb4e91627e77db485d.png

Теперь попробовал в работе ваш терминал. До этого я использовал вот такой:

work2.png.e4b6bb2b94c00b2771cca8fc379b464d.png

Вы видите, что пакеты запрос-ответ четко видны на разных строках.

Как добиться этого на вашем терминале, ибо я получил вот что:

work1.png.e719a59ba9eea22111348ee0965dd8e2.png

Согласитесь, что раобраться в этом сложнее.

Share this comment


Link to comment

Я готов согласиться с тем, что вы увидели что-то нечитаемое.

Но прошу пояснений: в вашем терминале "запрос-ответ" вы делали как? Т.е. что такое запрос и что такое ответ?

Судя по тому, что содержимое окна моего терминала все синее - это все ПРИХОДЯЩИЕ данные, т.е. те, которые пришли в порт. ИСХОДЯЩИХ, т.е. тех, которые в порт ушли от вас, там нет.

Share this comment


Link to comment

Эту программу писал не я. Там действительно обмен идёт между двумя контроллерами. Но терминал различает посылки видимо по временному зазору между ними и переводит строку автоматически в конце посылки.

Данные можно отображать в нём в HEX виде, в символьном виде и в символьном с отображением непечатаемые символов.

Некоторые моменты в нем не очень удобные, и для некоторых случаев я использую гипертерминал и термит.

Share this comment


Link to comment
9 минут назад, mazzi сказал:

Но терминал различает посылки

Чужие посылки различать может только СНИФФЕР, т.е. как бы "незаметный наблюдатель".

Терминал же служит именно для обмена информацией с кем-то или чем-то, и просто так "наблюдать" за чужим обменом не должен. Естественно, FTerm этого и не делает. Я вообще не очень понял, как вы смогли в FTerm увидеть то, что происходит между двумя устройствами... Поясните, как?

В принципе, если НАДО, то функцию "поиска пауз" в потоке данных можно и добавить... Но я должен понимать, что именно, зачем именно и как именно делать.

Share this comment


Link to comment

К компьютеру присоединено устройство USB - RS-485. Обмен идет в линии RS-485. Из терминальной программы я могу туда бросить свое сообщение.

Ну и получаю оттуда все что там происходит.

Share this comment


Link to comment
4 минуты назад, mazzi сказал:

Из терминальной программы я могу туда бросить свое сообщение

Я не представляю, как можно из терминальной программы бросить сообщение в порт, если этот порт уже занят другой программой... Если у вас для RS485 какая-то спец-программа с терминальным режимом - это совсем не то же самое, как просто терминальная программа...

Share this comment


Link to comment

Порт занят одной программой. Я включал их(программы) по очереди.

То же самое можно получить из любой терминальной программы, только не все могут отображать двоичные данные корректно.

Share this comment


Link to comment
Только что, mazzi сказал:

Порт занят одной программой

То есть ваше устройство просто выплевывает в СОМ-порт и то, что передало, и то, что приняло? Я не улавливаю, как двунаправленный трафик устройства попадает в однонаправленный канал RX порта...

Share this comment


Link to comment

В сети RS-485 может находиться несколько устройств, для моих нужд бывает до 10 шт. Обмен ведется полудуплексом, то есть один передает, остальные слушают канал. Потом могут отвечать. 

Слушают все одновременно. Отвечает один. Между посылками временной зазор.

Aw1M8.png.1451b2c52bcc967fa9861487e71f30dd.png

Картинку взял из интернета, но у меня что-то вроде этого, только левый серый блок переходник USB<->COM-port<->RS-485.

Share this comment


Link to comment
10 минут назад, mazzi сказал:

у меня что-то вроде этого

Вот теперь понял.

Да, если протокол обмена бинарный, без детектора пауз не обойтись. Или там в протоколе обмена есть какие-то маркеры начала и конца пакета? По маркерам можно выделить и без пауз...

Share this comment


Link to comment

IMG_20200205_151049.thumb.jpg.e62a53d8a2c6127c48c6b0f7faf8d7a8.jpg

Маркеров нет. Паузы. На фотке моего терминала видны справа временные метки.

На фотке то железо которое выдает обмен. Черная коробочка переходник USB<->RS-484

Ещё есть такой момент. Если вы сделаете в своей программе поддержку протокола MODBUS, то ваш терминал будет пользоваться спросом, поскольку до недавнего времени ничего внятного найти было просто невозможно. Все что более-менее было платное. Если вас это интересует, могу рассказать, что именно нужно.

Share this comment


Link to comment
2 часа назад, mazzi сказал:

могу рассказать, что именно нужно

С одной стороны, мне интересно сделать хорошую программу. С другой стороны, без тестировщиков это сделать нельзя. С третьей - протоколов больше одного Модбаса, и все всё равно поддержать не получится... Я сделал плагин формата, который можно настроить очень гибко для отображения приходящих пакетов. Так же есть плагин редактора пакетов для отправки. Попробуйте для начала попытаться помодбасить этими средствами - вдруг, этого уже более-менее достаточно? Ну а если не достаточно, тогда можете и рассказать, чего именно недостаточно...

 

2 часа назад, mazzi сказал:

Паузы. На фотке моего терминала видны справа временные метки

Я верно понял, что между пакетами пауза 20 мс и более? В принципе, можно сделать плагин, который будет ловить паузы больше 10 мс... Но в принятой концепции это будет работать только для текстового обмена. То есть придется сначала весь входящий двоичный поток плагином формата преобразовать в поток символов (00 2E FC A2 и т.д.), а потом фильтром временных интервалов добавлять в этот поток символы перевода строк - получится примерно то же самое, что у вас... Пойдет такой вариант?

Share this comment


Link to comment

Могу тестировать вашу программу. Я часто пользуюсь разными терминалами. Для Modbus-а нужно чтобы программа добавляла в посылку контрольную сумму. Методика расчета у меня есть. Могу даже исходник дать на си.

Share this comment


Link to comment

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

По поводу пауз между пакетам что скажете - я правильно понял, что 20 мс и более сигнализирует о конце пакета?

Share this comment


Link to comment

Вроде бы так, но для уверенности нужно глянуть мануал. Хотя на практике может быть и меньше зазор. Завтра могу уточнить.

На том скрине, который я приводил, там не модбас, там другой протокол.

Share this comment


Link to comment
16 минут назад, mazzi сказал:

Вроде бы так, но для уверенности нужно глянуть мануал. Хотя на практике может быть и меньше зазор. Завтра могу уточнить.

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

Share this comment


Link to comment

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...