Кросс-платформенный терминал

На написание сподвигло отсутствие вменяемых альтернатив с embedded-направленностью (работа на уровне байтов и т.д.) под Linux.



Отличия от альтернатив:
— параллельная работа с несколькими портами на разных вкладках;
— поддержка разных кодировок текста;
— возможность скриптования/обработки входного и выходного текста (на Javascript):

Пользовательские скрипты находятся в папке scripts.

Входные фильтры преобразуют массив полученной порции байт bytes_in в строку.

Примеры фильтров — в файлах in_hex.js — байты в Hex, in_chex.js — байты в C-массив.

Код фильтра in_hex.js:
//фильтр добавляется в глобальный объект filter.i
//представляет собой объект, содержащий 2х обязательных функции:
//  init - начальная инициализация состояния,
//  parse - читает массив полученных байт из переменной bytes_in и возвращает строку - результат их преобразования 
filter.i.HEX = { //HEX - название, которое будет отображаться в списке в окне терминала
    colsMax: 16, //макс.количество HEX-колонок
    cols: 0,     //счетчик колонки
    
    //инициализация
    init: function() {
        this.cols = 0;
    },
    
    //обработка
    parse: function() {
        var s = []; //массив кусков-строк, из которых будет собираться результат
        for (var b in bytes_in) {
            s.push(tools.b2h(bytes_in[b])); //преобразование байта в HEX-строку - используется функция b2h из файла tools.js
            s.push(' '); //добавляем пробел
            this.cols += 1; //переход на следующую колонка, на последней позиции добавляется перевод строки
            if (this.cols >= this.colsMax) {
                this.cols = 0;
                s.push('\n');
            }
        }
        return s.join(''); //сборка и возврат строки
    }
};

//начальная инициализация
filter.i.HEX.init();


Также возможна программная генерация массива байт для передачи. Для этого для переданного текста нужно выбрать формат JS в списке рядом с кнопкой send. Выходные байты добавляются в массив bytes.

Пример генерации байтов 0..90 с шагом 10:


Пример передачи запроса 03 Modbus-RTU (соответствующая функция — в файле proto_modbus.js):


Внизу прикреплен собранный проект, для запуска нужна Java JRE 7. Теоретически должен работать на всех системах (Windows/Linux/MacOS), но пока тестировалось только на 32-битных Linux и Windows.



Обновление от 16.10.13:

  • переписан интерфейс плагинов, теперь могут работать параллельно на разных вкладках;
  • добавлены настройки плагинов — кнопки, чекбоксы, поля ввода строк/чисел;
  • добавлено построение графиков на вкладке плагина;
  • плагин-парсер CSV с выводом графика (удобно выводить из контроллера измеряемые параметры и видеть их на графике):
  • +2
  • 28 августа 2013, 23:45
  • reptile
  • 2

Комментарии (26)

RSS свернуть / развернуть
Красивенько=))
На Windows 7 x64 заработало, пока без сбоев.
0
  • avatar
  • kalik
  • 29 августа 2013, 00:40
проект пока сырой — могут быть жуки, просьба сообщать о найденных.
0
Пока единственное что всплыло: когда порт отваливается (физически или из за помехи сбоит...) то программа никак не реагирует… не плохо было бы хоть сообщеньице высветить об этом.
0
ява все портит
ты не мог бы прикрутить к нему фт2232?
+1
попробуйте добавить ключики -server -XX:+AggressiveOpts -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -Dsun.java2d.opengl=true после javaw

ты не мог бы прикрутить к нему фт2232?
в смысле?
0
А оно что виртуальный ком-порт не видит?
0
вроде бы все видит
0
тогда не понятно в чем заключается вопрос Калобайта.
0
мне тоже. Разнообразные USB-RS232 и Bluetooth-RS232 видит без проблем
0
я имел в виду манипуляцию с выводами и поддержку спи и и2ц через яваскрипт
т.е. это получился как бы лпт порт, где можно управлять любым выводом
нужно для написания алгоритма работы с какой периферией, но чтобы не компилировать 100 раз
конечно яваскрипт не самое лучшее для этого и я изначально хотел использовать просто сишный синтаксис

правда прога получится уже совсем другая
0
что-то похожее уже делал, но в серверном варианте: we.easyelectronics.ru/reptile/dostup-k-posledovatelnym-portam-iz-brauzera-cherez-server.html

работа с RS232, сокетами, и с FTDI из Javascript.
0
скоро выложу допиленный под FT2xx Meerkat we.easyelectronics.ru/reptile/dostup-k-posledovatelnym-portam-iz-brauzera-cherez-server.html
0
проблема может быть если драйвер не стандартный VCP а d2xx — тогда к портам возможен доступ только через их библиотеку
0
На OS X 10.8.4 не запускается
0
пока ничего посоветовать не могу — нет доступа к ПК с MacOS.
попробуйте запустить muterm2.sh из терминала и посмотреть выхлоп в консоль.
возможно, нужно создать отдельную папку и App-файл.

еще пара ссылок:
www.bartbusschots.ie/blog/?p=296
forums.appleinsider.com/t/101615/os-x-batch-file-equivalent
0
0
Работает отлично, было бы чудесно прикрутить к функционалу еще 2 инструмента:
1) Отдельные поля для отправки команд, с кнопочкой отправить, к примеру для работы с модемом, в поля вводишь команды
«AT+CREG\r\n» — опрос состояния подключения к GSM сети
«AT+CSQ\r\n» — опрос уровня сигнала сети
«AT^SBV\r\n» — опрос уровня напряжения на модеме…
вообщем то, что нужно (сохранять набор команд в отдельный файл, для тестирования различных видов оборудования, и вытаскивать из файла обратно в поля)
плюс добавить возможность периодической отсылки команд по заданному периоду
2) Парсер для ответов, так же в отдельных полях и возможностью сохранения параметров парсера, например для работы с тем же модемом или навигационным модулем:
ответ на «AT+CSQ» начинается на "+CSQ:" и заканчивается на "\r\n", данные между ними вынести в поле, а лучше задать формат вроде такого "+CSQ%s\r\n", где %s — обозначение строки, которую нужно вывести, которая будет находится между +CSQ и \r\n, таким же образом выводить %d — числа в десятичном представлении, %h — hex, %b — binary… символ % представлять \%…
для более сложной выборки из строки (как в NMEA) добавить в синтаксис символы(строки) — разделители %' ' и %" ", которые позволят вытаскивать значение скажем достоверности координат в RMC сообщении NMIA таким образом (достоверность в данном случае — это символ A или V, стоящий между второй и третьей запятой внутри сообщения):
"#GPRMC%','%','%s%','\r\n" — вытаскиваем строку между второй и третьей запятой из сообщения с началом "#GPRMS" и концом "\r\n".
Координаты из того же сообщения "#GPRMC%','%','%','%s%','\r\n" — latitude(широта), "#GPRMS%','%','%','%','%','%s%','\r\n" — longitude (долгота).
При этом нужно понимать следующее:
а)Строка начала сооббщения заканчивается на символе %, строка конца сообщения начинается после буквы или символа, слудующего за последним %.
б) если нужно вытащить все сообщение, включаяя и начало и конец, то можно закончить строку каким нибудь спец символом, стоящим после строки конца сообщения (например %full — сообщение целиком, %start — только включая начало, %end — только включая конец).
И давать названия полям (какой параметр выводится) было бы тоже приятно.
Как то так, на мой взгляд получился бы удобный инструмент для тестов. Мне кажется я как то не до конца понятно изложил свою мысль, если интересно — спрашивайте непонятные части, по мере возможности отвечу.
Как то так, на мой взгляд получился бы удобный инструмент для тестов.
0
Если кто осилил и осмыслил текст: небольшое пояснение по пунктам а) и б), в пункте а) строка конца сообщения может так же начинаться после знака или символа после %, являющегося предпоследним, в случае, если последним являются спец символы (спец строки), описанные в пункте б).
0
В некоторых местах написал GPRMS вместо GPRMС, и еще концовку два раза повторил, извиняюсь, невнимателен
0
интересно, подумаю.
нужно добавить панели настроек скриптов для входа и выхода.
в объекте скрипта — список-описание его параметров.
и полный доступ к текстовым редакторам — тогда можно будет работать с текстом напрямую.
0

dmitry@dmitry-Lenovo:~/muterm$ uname -a
Linux dmitry-Lenovo 3.5.0-41-generic #64~precise1-Ubuntu SMP Thu Sep 12 16:50:04 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
dmitry@dmitry-Lenovo:~/muterm$ ls
css  doc  lib  locale  muterm2.bat  muterm2.jar  muterm2.sh  scripts
dmitry@dmitry-Lenovo:~/muterm$ ./muterm2.sh 
Exception in thread "main" java.lang.UnsupportedClassVersionError: muterm/MuTerm : Unsupported major.minor version 51.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: muterm.MuTerm. Program will exit.
0
java -version что пишет?
0
попробуйте заменить файл lib/jfxrt.jar на тот что идет с вашей версией Java (находится в папке jre/lib)
0
Чем Putty не устроил? :)
0
нет HEXa, невозможно передать сразу целую строку или блок текста (напр.для настройки Bluetooth модуля)
0
выложил новую версию
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.