Serial Analyzer 2.7.1
by Crovy
crovy@libero.it
www.javahouse.altervista.org

Indice

Informazioni Generali
Ringraziamenti
Cose Da Fare e problemi Noti
Menu
Area Comandi
Hot Keys
Tabs
Area Terminale
Status Bar
Programmazione
Modo Comandi
Risposte Automatiche
BeanShell
Aggiornamenti
Installazione



Informazioni Generali
SerialAnalyzer è un programma nato principalmente per monitorare i dati scambiati sulla linea seriale. Una prima evoluzione ha permesso anche l'invio di dati come un normale terminale. Infine il prodotto si è evoluto fino a comprendere la connessione TCP/IP con anche la funzionalità di Server.
Le caratteristiche principali sono:

Ringraziamenti
Si ringrazia Mario Gambino (mario.gambino-sr77@poste.it) per i consigli, il debug e per il tool di installazione da lui configurato.

Cose da Fare e Problemi Noti
Cose da fare:
  1. implementare una struttura a plug-in;
  2. poter cambiare i parametri della connessione dagli script in BeanShell;
Problemi Noti:
  1. Dalla versione 2.6.0 è stata introdotta la possibilità di selezionare il Look&Feel da un elenco che riporta i Look&Feel installati nel sistema.

    L'elenco dei Look&Feel installati viene fatto analizzando tutti i file "jar" presenti nella cartella "JAVA_HOME/lib/ext" e questo, su computer particolarmente vecchi, può richiedere molto tempo all'avvio del SerialAnalyzer.

    Se avete la necessità di velocizzare l'avvio potete cancellare la libreria "JcLafChooser.jar" presente nella cartella "lib" dove è installato il SerialAnalyzer.

    Togliendo questa libreria non viene più effettuata la ricerca dei Look&Feel e si potrà scegliere solo tra i Look&Feel automaticamente riconosciuti dal Java.
  2. premedo il tasto "F10" da tastiera si apre il menu "File". Credo sia un problema del Java;

Menu
Funzionalità dei menu:

Area Comandi
Funzionalità dell'area comandi:

Hot Keys
In questa sezione ci sono i dodici tasti di funzione richiamabili da tastiera e da mouse per l'invio di stringhe predefinite. Ad ogni tasto è associato anche un commento visualizzato automaticamente lasciando, per alcuni secondi, il cursore del mouse sul relativo tasto di funzione.
È possibile richiamare uno script in BeanShell inserendo la stringa "bsh(cartella/nomefile)".


Tabs
In questa sezione ci sono i Tabs per selezionare varie schermate:

Area Terminale
In questa sezione vengono visualizzati tutti i dati ricevuti e quelli trasmessi tramite HotKeys/Programmazione oppure digitati direttamente in questa area. Inoltre è possibile inviare direttamente dalla tastiera anche tutti i caratteri Ascii con codice da 0 a 31 semplicemente combinandoli con il tasto "control" (come identificati nella tabella Ascii). Ad esempio, per inviare il carattere con codice 3 (che equivale al CTRL-C) premere il tasto "CTRL" + il tasto "c".

Dalla versione 2.7.0 è stata introdotta l'opzione "Modo Comandi" (Command Mode) che permette di associare ad ogni tasto una sequenza di dati da inviare. Ovviamente, quando questa opzione è attiva, quanto descritto precedentemente, per i soli dati trasmessi, non è più valido.


Status Bar
Nella Status Bar sono visualizzate le seguenti informazioni:

Programmazione
Dalla versione 1.7.0 è stata introdotta la possibilità di creare un programma in modo da eseguire automaticamente delle operazioni ripetitive.
Dopo aver scritto le righe di codice è necessario eseguire la "compilazione", sia per verificare eventuali errori sia per rendere effettive le modifiche apportate al programma.
Quando viene caricato il programma da file, questo viene compilato automaticamente.
Per la programmazione ci sono alcune regole da rispettare:

Esempio di programmazione (invia 10 volte la stringa "ciao x" sostituendo a x il numero sequenziale da 1 a 10):
// setta la variabile 1 a 1
10:set(1,1);
// invia la stringa ciao
20:send(ciao );
// invia il dato convertito in ASCII della variabile 1
30:sendVar(1,ASCII,0);
// invia un CR LF in esadecimale
35:send([0D][0A]);
// incrementa la variabile 1
40:add(1,1);
// confronta se la variabile 1 è <= a 10
50:if(1,<=,10);
// confronto vero, torna alla linea 20
60:goto(20);
// confronto falso, fine programma
100:end();

Modo Comandi
Dalla versione 2.7.0 del SerialAnalyzer è stata aggiunta la modalità Modo Comandi (Command Mode) selezionabile tramite la check box CmdMode o dal menu Command.

La modalità di default è Modo Terminale (Terminal Mode), in questa modalità premendo un tasto viene visualizzato e inviato alla connessione aperta il carattere relativo al tasto premuto.

Selezionando la modalità Modo Comandi (Command Mode) è possibile associare ad ogni tasto una sequenza di caratteri da inviare alla connessione aperta come avviene per la definizione dei tasti di funzione Hot Keys. In questo modo è possibile espandere quasi all'infinito un elenco di sequenze richiamabili con la semplice pressione di un tasto.

La definizione della associazione tasto=comando si effettua nell'editor di Programmazione con le stesse regole di base utilizzate per la programmazione, compilazione compresa.

Le differenze sono le seguenti: Esempio file di programma con la definizione di due comandi associati ai tasti a e A:

>a=sequenza associata al tasto a minuscolo

>A=sequenza associata al tasto A maiuscolo

100:end();



Risposte Automatiche
Dalla versione 2.7.0 del SerialAnalyzer è stata aggiunta la possibilità di inviare automaticamente delle risposte analizzando i dati ricevuti. In realtà questa funzione era già presente (ed è rimasta) ma non permetteva la flessibilità introdotta ora.

In pratica si deve definire esattamente la sequenza di dati da riconoscere e la relativa risposta.

Queste definizioni si effettuano nell'editor di Programmazione con le stesse regole di base utilizzate per la programmazione, compilazione compresa e utilizzano anche la definizione dei tasti del Modo Comandi.

Le differenze sono le seguenti:
  • è possibile avere un unico file di programma contenente sia il programma che le definizioni del Modo Comandi che le definizioni delle Risposte Automatiche;
  • la riga deve iniziare con i caratteri ">aa=" seguito dalla lettera che identifica il tasto associato alla risposta e dal carattere "=";
  • dopo il carattere "=" si definisce la sequenza di caratteri da riconoscere per poter inviare la risposta associata al tasto precedentemente definito;
  • vedere Modo Comandi per le altre informazioni;
Esempio file di programma con la definizione di due risposte differenti associate ai tasti a e A:

>a=sequenza associata al tasto a minuscolo

>aa=a=ricevuto carattere a, rispondo con sequenza associata al tasto a

>A=sequenza associata al tasto A maiuscolo

>aa=A=ricevuto carattere A, rispondo con sequenza associata al tasto A

100:end();



BeanShell
Dalla versione 2.1.0 del SerialAnalyzer si è gestito l'interfacciamento con il programma, sempre in Java, BeanShell che permette di costruire degli script in Java interfacciabili con il SerialAnalyzer in modo da permettere di integrare funzionalità personalizzate al SerialAnalyzer.

Un esempio molto semplice è il calcolo del checksum. Tutti i protocolli di comunicazione prevedono un campo con il checksum del frame. Dal SerialAnalyzer è possibile inserire questo dato, ma va calcolato manualmente e se variamo un solo byte del frame dobbiamo aggiornare anche il dato del checksum. Con l'interfacciamento ad uno script in BeanShell è possibile automatizzare questa operazione in maniera molto semplice.

Per le istruzioni relative all'utilizzo di BeanShell si può consultare il relativo sito all'indirizzo http://www.beanshell.org/
Durante la fase di sviluppo/debug di uno script in BeanShell, si consiglia di aprire anche la finestra dove viene rediretto sia lo Standard Output che lo Standard Error (Menu -> Tools -> StdOut/Err Window) in modo da verificare tutti gli eventuali messaggi di errore che BeanShell restituisce.

Ora analizziamo l'interfacciamento con il SerialAnalyzer.

Innanzitutto occorre specificare che ci sono due modalità per eseguire uno script: dal menu "Tools" o da "HotKeys" (si può richiamare anche dal tool di programmazione integrato nel SerialAnalyzer e lavora come gli HotKeys).

Si è fatta questa distinzione per coprire esigenze diverse.


Nella cartella dove è installato il SerialAnalyzer viene creata una cartella "bsh" che a sua volta si divide in "menu" e "prog" per differenziare gli script richiamabili da menu e quelli da programmazione/HotKeys. Da queste cartelle si devono obbligatoriamente creare delle proprie cartelle per dividere in categorie i diversi script. Ad esempio si può creare una cartella "Checksum", sia sotto la cartella "menu" che sotto la cartella "prog", e qui metterci il file contenente lo scrip il quale deve avere l'estensione "bsh".

Sotto la cartella "menu" può essere creato un solo livello di cartelle, mentre sotto la cartella "prog" possono essere creati più livelli di cartelle che ovviamente devono essere scritti quando si richiama lo script.

Le cartelle, e gli script, creati sotto la cartella "menu" vengono automaticamente visualizzati come voce nel menu "Tools" del SerialAnalyzer (se si aggiungono nuove cartelle o file occorre riavviare il SerialAnalyzer per vedere aggiornate le voci del menu).
Io, ad esempio, ho inserito uno script per il calcolo del checksum che legge i dati che ho precedentemente selezionato dalla finestra "Terminal" e mi visualizza il risultato in un JOptionPane.

Al contrario delle cartelle e degli script creati sotto la cartella "menu", le cartelle e gli script creati sotto la cartella "prog" non sono visualizzati nel menu, ma sono richiamabili solamente da "HotKeys" inserendo la parola chiave "bsh(cartella/script)". Come "cartella" si intende il primo, o più livelli, dopo la cartella "prog" (che quindi non va scritta), mentre per "script" si intende il nome del file dello script senza estensione. Attenzione a rispettare le lettere maiuscole e minuscole come il nome del file. Per il separatore del file "/" si può usare indiferentemente "/" o "\", viene poi automaticamente adattato al sistema operativo utilizzato.

Dalla versione 2.2.0 è possibile chiamare degli script presenti nella stessa cartella del file di properties.
Gli script devono essere messi in una cartella "SaBsh" dove devono essere presenti le due solite cartelle "menu" e "prog". Nella cartella "menu", al contrario di quella presente nella cartella del SerialAnalyzer, non possono essere create altre cartelle, tutti gli script richiamabili da menu devono essere in questa cartella.
Quando si carica un file di properties da una cartella diversa da quella di avvio del SerialAnalyzer, il programma automaticamente cerca gli script e, se presenti, abilita nel menu "Tools" la voce "PropertiesPathScript" che a sua volta conterrà l'elenco degli script.
Per gli script chiamabili da programmazione/HotKeys si deve mettere il simbolo "@" prima del nome dello script, ad esempio bsh(@cartella/script);

Attenzione, con il sistema operativo Linux ho notato che se il SerialAnalyzer viene eseguito da shell con il comando "java -jar SerialAnalyzer.jar" tutto funziona correttamente e la proprietà di sistema (Java) "user.dir" punta correttamente alla cartella dove è presente il file "SerialAnalyzer.jar" e quindi il programma vede correttamente la cartella "bsh" dove sono presenti gli script in BeanSheel.
Se invece il file "SerialAnalyzer.jar" viene eseguito con un doppio click dal file browser, Konqueror, Nautilus, ecc. ecc., la proprietà di sistema (Java) "user.dir" punta sempre alla home dell'utente e quindi il programma non trova la cartella "bsh" e di conseguenza gli script in BeanShell.
Per verificare l'impostazione della proprietà "user.dir" dal SerialAnalyzer bisogna selezionare la voce "System Info" presente nel menu "Help".

Per facilitare la scelta dello script, nel menu Tools è stata inserita una voce "Select Program Script" che permette di navigare nella directory "prog" degli script e di selezionare uno script. Una volta selezionato lo script viene automaticamente incollato nella Clipboard la stringa per richiamare lo script selezionato, ad esempio "bsh(Checksum/Crc16)".

Quando viene invocato uno script, il SerialAnalyzer mette a disposizione dei riferimenti a variabili e dei metodi che ora andremo ad analizzare.

Riferimenti a variabili:
  • parent = rappresenta la classe "BeanShellCaller" utilizzata dal SerialAnalyzer per invocare lo script. Occorre fare riferimento a "parent" per chiamare tutti i metodi che il SerialAnalyzer mette a disposizione;
  • parent.jFrame = rappresenta il riferimento al JFrame del SerialAnalyzer per utilizzare le GUI nello script (ad esempio per centrare il JOptionPane);


Riferimenti a metodi:
  • String getSelectedText() = ritorna in una stringa i dati selezionati nella finestra "Terminal";
  • Vector stringToIntDataVect(String) = ritorna in un vettore di Integer i dati in binario convertiti dalla stringa di testo ascii con le convenzioni per rappresentare i dati usate dal SerialAnalyzer ([02] per i dati esadecimali e <002> per quelli decimali);
  • String intToString(int) = ritorna una stringa ascii, nel formato CTRL -->HEX, del dato int binario;
  • Vector getApplicationDataVect() = restituisce un vettore di Integer di dati in binario messi a disposizione dal SerialAnalyzer. In particolare sono quei dati inseriti prima della chiamata allo script. Ad esempio se definiamo il tasto "F1" con la seguente stringa "[02]provabsh(Checksum/8bit)", chiamando questo metodo dallo script mi verrà restituito, in forma binaria, "0x02 0x70 0x72 0x6f 0x76 0x61".
  • String getApplicationDataString() = restituisce una stringa ascii, nel formato CTRL -->HEX, dei dati messi a disposizione dal SerialAnalyzer. In particolare sono quei dati inseriti prima della chiamata allo script. Ad esempio se definiamo il tasto "F1" con la seguente stringa "[02]provabsh(Checksum/8bit)", chiamando questo metodo dallo script mi verrà restituita esattamente la stessa stringa "[02]prova".

    Presente dalla versione 2.6.1
  • setScriptDataVect(Vector) = serve per restituire al SerialAnalyzer un vettore di Integer contenente i dati in binario da inviare a seguito della chiamata allo script da HotKeys. Rifacendosi all'esempio di prima, è stato invocato lo script per calcolare il checksum, lo script lo calcola e deve restituire un vettore con i dati originali più il dato del checksum;
  • boolean isStopThread() = serve per capire se il SerialAnalyzer richiede di interrompere il Thread dello script;
  • sendData(String) = serve per inviare una stringa di dati ascii, con le convenzioni per rappresentare i dati usate dal SerialAnalyzer, sul canale di comunicazione aperto. I dati inviati vengono visualizzati nella finestra "Terminal";
  • sendData(Vector) = serve per inviare un vettore di Integer di dati binari sul canale di comunicazione aperto. I dati inviati non vengono visualizzati nella finestra "Terminal";
  • enableRxData(boolean) = serve per abilitare la gestione dei dati ricevuti. Questo comporta che lo script si occupi di leggere (tramite un Thread) i dati dal pipedInputStream messo a disposizione, altrimenti si rischia il blocco del SerialAnalyzer;
  • enableSendDisp(boolean) = serve per abilitare la visualizzazione dei dati trasmessi;
  • enableRxDisp(boolean) = serve per abilitare la visualizzazione dei dati ricevuti;
  • endScript() = serve per segnalare la fine dello script.
    È una chiamata obbligatoria da aggiungere alla fine dello script!
  • int getRxData() = serve per leggere eventuali dati ricevuti.
    Ritorna -1 in caso di dato non disponibile, altrimenti ritorna il dato.
  • clearTerminalArea() = serve per cancellare l'area terminale.
  • boolean clientIsOpen() = serve per verificare se la connessione client è aperta.
    Ritorna true se è aperta, false se è chiusa.
  • boolean clientOpen() = serve per aprire la connessione client.
    Ritorna true se è stata aperta, false in caso di errori.
  • clientClose() = serve per chiudere la connessione client.
  • setLastBshFilePath(String) = permette di memorizzare il path di un file gestito nello script.

    Questo può risultare comodo alla successiva esecuzione dello script per indicare al JFileChooser la cartella usata precedentemente. Il dato rimane memorizzato fino alla chiusura del Serial Analyzer.

    Presente dalla versione 2.7.0
  • String getLastBshFilePath() = restituisce il path precedentemente memorizzato con setLastBshFilePath.

    Presente dalla versione 2.7.0
  • setLastBshFileName(String) = permette di memorizzare il nome di un file gestito nello script.

    Questo può risultare comodo alla successiva esecuzione dello script per indicare al JFileChooser il file usato precedentemente. Il dato rimane memorizzato fino alla chiusura del Serial Analyzer.

    Presente dalla versione 2.7.0
  • String getLastBshFileName() = restituisce il nome del file precedentemente memorizzato con setLastBshFileName.

    Presente dalla versione 2.7.0

Nella cartella bsh sono forniti alcuni esempi di script.



Aggiornamenti

Di seguito vengono riassunti tutti gli aggiornamenti del SerialAnalyzer:

Installazione
Il SerialAnalyzer è un programma sviluppato in Java e quindi necessita di avere già installato sul PC la Java Virtual Machine (JRE) della SUN. Può funzionare con il JRE dalla versione 1.5 in avanti.
Le ultime versioni sono fornite di un apposito tool di installazione (sempre in Java) che automatizza tutta la procedura.

Per una installazione manuale procedere nel seguente modo: