Come interagire col modulo Flyport Ethernet utilizzando la porta UART

Il moduli Flyport Ethernet, come Arduino e Netduino, hanno un piccolo software (bootloader) che permette di utilizzare una connessione seriale per caricare il firmware nella propria memoria. Il canale seriale viene anche usato per eseguire operazioni di debug, o comunque per scambiare dati col computer o altri dispositivi.
Inviare dati dal Flyport al computer, è una operazione che personalmente trovo fondamentale per poter capire se il programma sta girando nel modo che mi aspetto.

La seriale utilizzata per caricare il firmware sul Flyport Ethernet è disponibile sul pin p13 (UART RX input) e sul pin p15 (UART TX output). Sono disponibili ulteriori 3 porte seriali impiegando i pin rimappabili. Per questo tutorial utilizzeremmo la porta seriale principale (pin p13 e p15), perché essendo collegata al miniUSB PROG permette, senza l’ausilio di circuiti aggiuntivi, di creare una connessione seriale col pc.

Alcune informazioni aggiuntive sulla comunicazione seriale potete trovarle in questo precedente articolo https://logicaprogrammabile.it/netduino-collegamento-seriale-rs232/.

La prima istruzione che dobbiamo scrivere riguarda l’inizializzazione della porta da usare e la velocità di comunicazione

[c]
//specifica il numero di porta e
//la velocità
UARTInit(1, 19200);
[/c]

Dopo la configurazione, per poter inviare e ricevere dati dobbiamo attivare la porta con la seguente istruzione:

[c]
//attivo la porta seriale 1
UARTOn(1);
[/c]

Inviamo una serie di caratteri singoli al pc, utilizzando un ciclo while() e l’istruzione UARTWriteCh()

[c]
#include "taskFlyport.h"

void FlyportTask()
{
UARTInit(1, 19200);
UARTOn(1);

while(1)
{
//invia il carattere A tramite
//la porta UART 1
UARTWriteCh(1, ‘A’);
//ritardo di 100ms
DelayMs(100);
}
}
[/c]

Compiliamo il sorgente e carichiamolo sul Flyport Ethernet. Dal tab View dell’Openpicus Flyport IDE, clicchiamo sul pulsante Serial Monitor.

Serial Monitor

Sul lato destro della finestra verrà visualizzato il pannello Serial Monitor. Selezioniamo la porta COM, dove è collegato il convertitore miniUSB PROG (nel mio caso la COM21), selezioniamo la velocità di comunicazione corretta, come quella specificata nell’istruzione UARTInit (nel mio caso 19200) e clicchiamo il pulsante Connect per avviare la ricezione dei caratteri inviati dal modulo Flyport Ethernet, per interrompere l’acquisizione utilizziamo il pulsante Close.

Serial Monitor

I dati provenienti dal modulo verranno printati sul Serial Monitor.
Abbiamo la possibilità di inviare una serie di caratteri (buffer) con una singola istruzione, utilizzando la funzione UARTWrite()

[c]
#include "taskFlyport.h"

void FlyportTask()
{
UARTInit(1, 19200);
UARTOn(1);

while(1)
{
//invia una serie di caratteri
//tramite la porta UART 1
UARTWrite(1, "Flyport Ethernet");
//ritardo di 100ms
DelayMs(100);
}
}
[/c]

Nel codice precedente sul serial monitor visualizzeremo la frase “Flyport Ethernet”.
Nel caso in cui volessimo spedire i dati in formato byte, dovremmo impiegare un buffer come descritto nel codice seguente:

[c]
#include "taskFlyport.h"

void FlyportTask()
{
UARTInit(1, 19200);
UARTOn(1);

char buffer[6];

//assegno dei valori in byte (0-254)
 buffer[0] = 1;
 buffer[1] = 65;
 buffer[2] = 45;
 buffer[3] = 2;
 buffer[4] = 15;
 buffer[5] = 14;

while(1)
{
//invia l’intero buffer
UARTWrite(1, buffer);
//ritardo di 100ms
DelayMs(100);
}
}
[/c]

Leggere i dati

La ricezione dei dati è affidata all’istruzione UARTRead().  La ricezione avviene tramite la creazione di una area di memoria (buffer) la cui dimensione deve essere decisa in base alla quantità di dati da ricevere.

Nel seguente esempio, utilizzo sempre il Serial Monitor per inviare un byte al modulo.

[c]
#include "taskFlyport.h"

void FlyportTask()
{
UARTInit(1, 19200);
UARTOn(1);

//creo un buffer da 1 byte per memorizzare
//i dati ricevuti dalla seriale
char buffer[1];
int numDataRX = 0;

while(1)
{
//leggo dalla seriale 1 byte e lo memorizzo
//sul buffer precedentemente creato
numDataRX = UARTRead(1, buffer, 1);

//se ho ricevuto dei dati invio
//una stringa di conferma al serial monitor
if(numDataRX > 0)
{
UARTWrite(1, "RX OK\n");
}

DelayMs(10);
}
}
[/c]

Sono necessarie diverse prove per prende confidenza con l’utilizzo della seriale. Saperla adoperare è fondamentale per poter sviluppare tutti i tipi di progetti perché può essere usata per operazione di debugging utili a verificare la corretta esecuzione del codice.