Lettura continua dal buffer
Ciao Renzo,
Abbiamo notato un difetto della libreria ma non siamo sicuri sia un difetto, te lo voglio esporre.
Come prima cosa ti dico che utilizziamo gli Ebyte E220 900MHz in Transparent Transiossion con crittografia attiva e RSSI attivo.
Fino ad ora abbiamo sempre inviato comunicazioni del tipo "##D:1:2:3:4:5:6:7:8:9:10##" 26 Byte e ricevuto sempre bene.
Facendo un pò di test, abbiamo mandato un messaggio di lunghezza 116 Byte quindi "##D:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40##" e abbiamo notato che sul nodo (Arduino con tua libreria) arriva "##D:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:2" ovvero 62 Byte.
Quello che mi sono chiesto è: ma perchè ricevo solamente questi 62 Byte? La libreria l'ho impostata a ricevere e trasmettere 200 Byte quindi con il codice "configuration.OPTION.subPacketSetting = SPS_200_00;".
Ho provato a fare un test ho estratto il modem dal nodo, che abbiamo fatto con Arduino, e l'ho letto semplicemente con un convertitore USB/UART con un programma per leggere la seriale (AccessPort ma anche IDE Arduino).
Qui arriva l'intero messaggio senza problemi. ANZI ho provato a scrivere fino a 100 nodi, ovvero "D:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:83:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:100" che sono 296 Byte e lo riceve tutto.
Ho notato però un particolare, tenendo fissato il monitor si vede chiaramente che fa scritture differenti molto molto veloce, quindi spezzetta il messaggio in più parti.
Ad esempio ora sul nodo ricevo solamente un parte del messaggio, ovvero "##D:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:1" che sono 41 Byte.
Secondo me in qualche modo il modem intelligentemente prende il messaggio e lo spezzetta trasmettendo un pezzo alla volta ma molto molto velocemente.
Noi con la libreria effettivamente una volta che l'oggetto è aviable "e220ttl->available() > 1" leggiamo il messaggio nel buffer con il codice "ResponseContainer rc = e220ttl->receiveMessageRSSI();" e poi andiamo oltre....
Ma se fosse da metterlo in pausa e vedere se subito dopo c'è altro?
Ho fatto un test: avendo messo due cancelletti "##" a inizio e due a fine messaggio, sò quando il messaggio è arrivato tutto e quindi ho pensato, leggendo l'ultimo carattere se non è "#" rileggo il buffer con questo codice:
String input = "";
while (e220ttl->available() > 1)
{
bool endMessage = 0;
while (!endMessage)
{
ResponseContainer rc = e220ttl->receiveMessageRSSI();
input = rc.data;
Serial.println(input);
char last = input.charAt(input.length() - 1);
Serial.print("L'ultimo carattere: ");
Serial.println(last);
if (last == '#')
{
endMessage = 1;
}
}
}
Ma mi legge solo la prima parte come vedi dal monitor seriale:
##D:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:1
L'ultimo carattere: 1
L'ultimo carattere: ␀
L'ultimo carattere: ␀
L'ultimo carattere: ␀
L'ultimo carattere: ␀
e cosi all'infinito....
In conclusione la mia domanda è: sarebbe possibile leggere tutto il messaggio come accade se metto il modem in un lettore seriale via USB?
Grazie e buon lavoro!!