Hacking Icaro – centralina GSM – il logger seriale
Questo primo sketch di prova utilizza una board ESP32 per leggere i dati scambiati tra il microcontrollore e il modem della scheda GSM/GPS della Icaro: vengono letti contemporaneamente i due canali in modo da mantenere la sincronia tra messaggi inviati e ricevuti, e poter meglio ricostruire il dialogo.
Al momento la “registrazione” viene effettuata solo inviando l’output al serial monitor dell’Arduino IDE; una successiva versione memorizzerà i dati o in una SD card, o su un server remoto, in modo che il logger possa essere montato direttamente sul veicolo senza necessità di un PC.
Trattandosi di un generico logger seriale a due canali, può in realtà essere usato per “sniffare” qualunque altra comunicazione seriale tra due dispositivi, o anche per loggare un singolo dispositivo.
Il numero a inizio linea identifica il canale cui si riferisce la linea stessa.
// Greengo/Zhidou/Xindayang GSM logger
// Read data from GSM/GPS logger, from both MCU and MODEM outputs and same time
// using ESP32 board.
// V. 0.1.0 - First working version; logs only to USB/serial port (PC needed).
String tempVal = ""; String row0 = ""; String row1 = ""; int MAXLEN = 50;
void setup() { // initialize serial: // Recommendation: use Serial0 and 1 for your duplex devices and serial2 for your debug messages. // https://github.com/espressif/arduino-esp32/issues/1314 // // Standard serial pinouts: // https://circuits4you.com/2018/12/31/esp32-hardware-serial2-example/ // UART RX TX CTS RTS // UART0 GPIO3 GPIO1 N/A N/A // UART1 GPIO9 GPIO10 GPIO6 GPIO11 // UART2 GPIO16 GPIO17 GPIO8 GPIO7 // But all 3 HW UARTs can be remapped to any pin. Serial.begin(9600,SERIAL_8N1, 16, 17); // Input 1 (16 = RX) Serial1.begin(9600,SERIAL_8N1, 4, 2); // Input 2 (4 = RX) Serial2.begin(9600,SERIAL_8N1, 3,1); // Standard USB-serial port Serial2.println("Free heap:"); Serial.println(ESP.getFreeHeap()); Serial2.println("--------------------"); }
void loop() { // read from port 0, send to port 2: if (Serial.available()) { int inByte = Serial.read(); /* Serial2.print("\t0\t0x"); Serial2.print(inByte,HEX); Serial2.print("\t"); Serial2.print(inByte,DEC); if (inByte>31) { Serial2.print("\t"); Serial2.write(inByte); } Serial2.println(); */ tempVal = String(inByte); row0 += "\t" + tempVal; if (row0.length() > MAXLEN) { Serial2.print("0\t"); Serial2.println(row0); row0=""; } }
// read from port 1, send to port 2: if (Serial1.available()) { int inByte = Serial1.read(); /* Serial2.print("\t1\t0x"); Serial2.print(inByte,HEX); Serial2.print("\t"); Serial2.print(inByte,DEC); if (inByte>31) { Serial2.print("\t"); Serial2.write(inByte); } Serial2.println(); */ tempVal = String(inByte); row1 += "\t" + tempVal; if (row1.length() > MAXLEN) { Serial2.print("1\t"); Serial2.println(row1); row1=""; } } }
leave a comment