Comunicazione Serial.

Gli strumenti di "libreria" Serial standard consentono di inviare e ricevere dati tramite l'interfaccia UART. Qui considereremo alcuni algoritmi e protocolli di comunicazione per stabilire il controllo manuale del programma attraverso il monitor della porta o utilizzare programmi speciali per questo, nonché un'applicazione su uno smartphone e moduli Bluetooth-UART. Tra due Arduino, o tra Arduino e un altro MK (esp8266, STM32), puoi comunicare via Seriale. Per fare ciò, è necessario collegarli come segue:
  • Collegare GND, perché il segnale non va su un filo.
  • Per la comunicazione unidirezionale, collegare i pin dati al mittente -> ricevitore come TX -> RX.
  • Il seriale può essere hardware (i pin sono firmati sulla scheda) o software, ad esempio la libreria SoftwareSerial.h integrata. I pin sono specificate manualmente.
  • Per la comunicazione bidirezionale è necessario collegare anche RX -> TX.
  • Attenzione! Se il firmware viene caricato tramite un hardware UART, ad esempio TX RX su Arduino Nano, allora il pin RX deve essere liberato, altrimenti il ​​firmware non verrà caricato.
Per trasferire i dati tra le schede, puoi utilizzare le funzioni discusse sopra e gli algoritmi discussi di seguito, ma voglio mostrarti un modo particolarmente conveniente per trasferire strutture di dati utilizzando gli strumenti principali di Arduino standard. Una struttura è un insieme di dati di qualsiasi tipo, molto comodo per trasferire dati diversi. I dati vengono inviati con Serial.write(byte buffer, size) e ricevuti con Serial.readBytes(byte buffer, size). Lo svantaggio di readBytes è che sta bloccando: l'esecuzione del codice non va oltre finché la funzione non ha ricevuto il numero di byte specificato o non ha completato il lavoro in timeout. Entrambe le funzioni prendono un buffer di byte, ma sappiamo dei puntatori e dei loro tipi, quindi possiamo ingannare (byte*) nell'invio e nella lettura della struttura. Di seguito sono riportati esempi di come inviare e ricevere una struttura da un Arduino all'altro utilizzando SoftwareSerial, allo stesso modo in cui puoi utilizzare un normale hardware Serial. Anche un esempio di invio e lettura con controllo dell'integrità dei dati è CRC, che aumenta notevolmente l'affidabilità della trasmissione: ti permetterà di riconoscere un errore nel pacchetto se almeno un bit è stato trasmesso o ricevuto in modo errato. Gli esempi funzioneranno su qualsiasi scheda compatibile con Arduino, comprese quelle basate su esp8266, ci sono alcune caratteristiche con esso, le discuteremo di seguito.
Invio:

Lettura:

Invio con CRC:

Lettura con CRC:

Caratteristiche di esp8266.

Quando si utilizza il metodo sopra descritto per inviare dati a o da esp, ci sono alcune cose da tenere a mente sulla memoria in esp:

  • Il tipo di dati int richiede 4 byte per esp, ovvero Arduino dovrebbe accettare questo tipo come long.
  • Il compilatore esp comprime i byte in una struttura in un modo molto strano, quindi i tipi di dati a byte singolo devono essere posizionati alla fine della struttura.
Ad esempio in questo modo:

  • Posizionare prima i tipi di dati pesanti (float, int, long).
  • int qui prende 4 byte, quindi su Arduino deve essere accettato come long.
  • Posiziona i byte alla fine della struttura.
  • La struttura delle strutture del destinatario e del mittente deve essere la stessa.
struct myStruct 
     float val_f; 
     float val_f2; 
     int val_i; 
     long val_l; 
     byte val_b;
};

Altri algoritmi di analisi:
Esistono due opzioni di base: inviare un pacchetto di tutti i dati e analizzarlo, oppure inviare ciascun parametro separatamente con una "chiave" univoca per ciascuno. Come capirlo: l'essenza della prima opzione è accettare un pacchetto di dati separato da un separatore. Sarà anche corretto evidenziare l'inizio e la fine del pacchetto. 
Esempio: $123 45 678 9; - carattere iniziale $, separatore " " (spazio) e carattere finale ; . La presenza di un carattere di inizio e fine aumenta la velocità e l'immunità al rumore della comunicazione. La seconda opzione sono i messaggi della forma MOT1_120 contenenti una chiave e un valore corrispondenti a questa chiave.
Esempi:
Ricevi testo da Serial.

Accettazione di due numeri float.

Analisi del flusso seriale. Opzione 1 (strtok_r, nessun ritardo).

Questo algoritmo ti consente di ottenere un sacco di valori tramite Serial e di disperderli in un array intero. Puoi usarlo banalmente per controllare QUALSIASI COSA tramite bluetooth, poiché i moduli bluetooth hanno un'interfaccia di comunicazione UART. Oppure controllo via Seriale da qualche programma da PC. ATTENZIONE! L'analisi funziona tramite la funzione pesante strtok_r. Si consiglia di utilizzare altri algoritmi o una raccolta di algoritmi.

Analisi del flusso seriale. Opzione 2 (manuale, nessun ritardo).

Differenza dall'esempio precedente: e senza l'uso di funzioni complesse. Funziona in modo molto semplice e chiaro. 

L'analisi seriale è separata. Opzione 3 (ritardata).

L'analisi seriale è separata. Opzione 4 (ritardata).

L'analisi seriale è separata. Opzione 5 (lettera singola, nessun ritardo).

L'analisi seriale è separata. Opzione 6 (interfaccia di testo, readString).

L'analisi seriale è separata. Opzione 7 (comodo, readString).

L'analisi seriale è separata. Opzione 8 (comodo, ottimale).

L'analisi seriale, il mio progetto "Receive_SMS" (libreria "ATCommand_1.0").

Questo esempio si basa su una scheda Arduino e un modulo SIM800L, interconnessi tramite protocollo UART.

Crea il tuo sito web gratis! Questo sito è stato creato con Webnode. Crea il tuo sito gratuito oggi stesso! Inizia