Arduino e comunicazione UART con programma in C

Salve a tutti,

premetto che sono nuovo e che da poco mi sono avvicinato al mondo di Arduino.
ho cercato un po' online, ma non ho trovato una spiegazione chiara di quello che cerco.

Ecco la mia situazione:

  • ho un programma in C compilato su windows attraverso MinGW. (questo non puo' essere cambiato)
  • vorrei che il mio Arduino comunicasse durante il loop del programma in C ogni volta richiesto dal programma stesso.

Le mie domande:
1- che tipo di libreria avrei bisogno sul programma C pe riuscire a comunicare ocn l'UART di Arduino?
2- che librerie ho bisogno su Arduino?
3- avete esempi semplici sulle funzioni utilizzate su C e sull'arduino?
4- Potrebbe essere una soluzione far scrivere ad Arduino su un txt sul computer e farlo leggere dal programma in C? a mio avviso sarebbe molto piu' lento, ma potrebbe essere una soluzione piu' semplice?

Grazie in anticipo per le risposte e i consigli!

buona giornata

Buongiorno tuttorouge,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO … Grazie. :slight_smile:

Devi spedire una stringa o dei dati alla USB (port COM) dove é collegato l'arduino.
Ciao Uwe

come ti ha suggerito uwe devi usare la com alla quale è collegato arduino per stabilire una comunicazione tra il tuo programma su pc che invierà un codice alla seriale per richiedere i dati ad arduino e dal lato arduino il programma dovrà essere in ascolto sulla stessa seriale quando riceve il codice previsto invia i dati richiesti

Ma, il programma sul pc lo puoi cambiare?
La parte di comunicazione li è già scritta, e se sì cosa fa?
Da li si può partire con arduino

Standardoil:
Ma, il programma sul pc lo puoi cambiare?
La parte di comunicazione li è già scritta, e se sì cosa fa?
Da li si può partire con arduino

Grazie a tutti per le risposte.
No non vi è nulla di scritto su programma C. E non saprei da dove cominciare.
Un amico mi ha indicato la libreria r232 per C da implementare nel programma C. Ma non sono sicuro di cosa debba fare.

Per quanto riguardo inviare una stringa per quelli che mi hanno risposto prima:
un Serial.print potrebbe funzionare?

Serial.println(q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
delay(80)

una cosa del genere potrebbe andare?

Funzionare funziona
Se poi q è un array di valori numerici stampa anche il numero giusto
Quanto a riceverlo e riconoscerlo lato pc, avrei dei dubbi, senza terminato e un protocollo, anche solo minimale
Spiega bene il tuo problema, cosa devi trasmettere e come e quando

Standardoil:
Funzionare funziona
Se poi q è un array di valori numerici stampa anche il numero giusto
Quanto a riceverlo e riconoscerlo lato pc, avrei dei dubbi, senza terminato e un protocollo, anche solo minimale
Spiega bene il tuo problema, cosa devi trasmettere e come e quando

giusto, ecco una migliora spiegazione:

  • Il programma in C dovrebbe essere il master che ad ogni loop invia un array di 7 numeri (float), aspetta che Arduino calcoli e re-invii altri numeri (float)
  • Su arduino devo trasmettere una serie di numeri in formato float. una cosa del genere per intenderci.
    Serial.print(" ");
    Serial.print  ( q[1] );
    Serial.print(" ");
    Serial.print  ( q[2] );
    Serial.print(" ");
    Serial.print  ( q[3] );
    Serial.print(" ");
    looptime =micros() - time;
    Serial.print(looptime);
    Serial.print ("\n");
    delay(80);
  • il programma C deve aspettare prima di avanzare al prossimo step , non puo' saltare un calcolo di arduino.
  • la velocità tra i due non è molto importante. Piu' veloce è lo scambio di dati, piu' veloce finisce :slight_smile: L'importante è che il programma in C non avanzi senza aver il calcolo completo da Arduino.

Chiedo scusa in anticipo per il mio linguaggio da non-programmatore. Sono veramente alle prime armi e qualsiasi consiglio e correzione è ben accetto!
Grazie a tutti!

mmmm sei cosciente che i float in arduino sono a 32 bit e che la precisione è di 6 cifre (non dopo la virgola ma in totale)

In generale far fare dei conti ad arduino avendo a disposizione un Pc è idea bizzarra.
Quindi lo prendo non tanto come un problema da risolvere quanto come un esercizio, una prova per usi futuri
Ok, per me va bene uguale,
Lato pc hai qualcosa? Mi sembra di no
Eventualmente sei in grado di gestire la parte di comunicazione dal pc?
Io ti posso aiutare lato arduino. Ma lato pc non ho windows, quindi non ho il tuo ambiente
Magari qualcuno qui può consigliare qualcosa per il Pinguino che sia "uguale uguale" a mingw per Windows
Sì lo so che mingw è un porting per windows di un ambiente GNU, ma qui serve qualcosa che sia "uguale uguale"

Standardoil:
In generale far fare dei conti ad arduino avendo a disposizione un Pc è idea bizzarra.
Quindi lo prendo non tanto come un problema da risolvere quanto come un esercizio, una prova per usi futuri
Ok, per me va bene uguale,
Lato pc hai qualcosa? Mi sembra di no
Eventualmente sei in grado di gestire la parte di comunicazione dal pc?
Io ti posso aiutare lato arduino. Ma lato pc non ho windows, quindi non ho il tuo ambiente
Magari qualcuno qui può consigliare qualcosa per il Pinguino che sia "uguale uguale" a mingw per Windows
Sì lo so che mingw è un porting per windows di un ambiente GNU, ma qui serve qualcosa che sia "uguale uguale"

esatto il concetto non è quello di farlo fare al computer ma piu un esercizio per un hardware in the loop.
Per quanto riguarda sul pc: considera il fatto che ho un programma in C che viene compilato in mingw.
Ma per la comunicazione non ho assulutamente nulla di implementato a livello di librerie.
Quindi possiamo dire che non ho nulla.

riguardo float e 32bit da arduino: sei cifre sono piu che sufficienti.

Patrick_M:
mmmm sei cosciente che i float in arduino sono a 32 bit e che la precisione è di 6 cifre (non dopo la virgola ma in totale)

..e che se li stampi così con Serial.print() vengono renderizzati con soli 2 decimali? (es. 123.456789 -> "123.45")? Ricorda di mettere un secondo parametro per indicare i decimali che ti occorrono, es.
Serial.print(q[0], 6);

docdoc:
..e che se li stampi così con Serial.print() vengono renderizzati con soli 2 decimali? (es. 123.456789 -> "123.45")? Ricorda di mettere un secondo parametro per indicare i decimali che ti occorrono, es.
Serial.print(q[0], 6);

perfetto! grazie!

Ma sul lato C? qualcuno ha qualche idea cosa possa fare?

Mah, guarda...
Basta fare una ricerca per
Serial port in C Windows
Trovi....