Arduino e programma C++ comunicazione seriale

Ciao ragazzi,
vorrei effettuare una comunicazione seriale fra arduino ed un programma in C/C++ che gira sul pc.
Ho letto che è possibile gestire le porte seriali come dei file.
Ho provato ed effettivamente "funziona", ma ovviamente ho problemi :roll_eyes:

1)Se non sbaglio, il C scrive sul file solo dopo il comando nomefile.close(), infatti quando richiamo arduino.close() il led mi si accende assieme ai led TX e RX, ma poi mi si spegne subito (questione di millisecondi)

2)non c'è un modo più comodo? perchè la libreria fstream è utile quando devi scrivere dei file binari o testuali, ma già se voglio scrivere un intero devo fare il cast e quant'altro ed è un po' noioso.
in questo caso la cosa più veloce che mi è venuta in mente è mandare "123" che corrisponde al carattere "{".

Allego i due programmi, sono banali e potrebbero essere sbagliati :cold_sweat: (effettivamente avrei dovuto provarci prima e non alle 2 di notte).

Grazie

p.s.: invece del C++ conoscete un linguaggio più comodo per controllare un pc con windows? ovvero ad esempio aprire file (musica ad esempio) e così via

provaSerial.cpp (507 Bytes)

prova_serial.ino (376 Bytes)

salvatore_94:
p.s.: invece del C++ conoscete un linguaggio più comodo per controllare un pc con windows? ovvero ad esempio aprire file (musica ad esempio) e così via

Tutto dipende da quello che devi fare, un modo molto comodo per scrivere codice che gira su PC (Windows, OS X, Linux) è usare Processing, oltre ad offrire supporto diretto per Arduino ha molte librerie specializzate per fare quasi tutto, inclusa la gestione del sonoro sia come midi che come player di file.
Da notare che sebbene processing è un framework per Java il codice si scrive in stile C like, l'IDE è lo stesso di Arduino, o meglio Arduino usa l'IDE di Processiong, ed è molto, ma molto, simile lo stile di scrittura.
Per il C/C++ esistono una miriade di librerie per gestire la seriale in modo molto efficiente, quale usare dipende dal compilatore.

Ciao, la comunicazione seriale con arduino è sempre quella, leggere un byte o leggere una stringa troviamo esempi online.

Il tuo problema è nel linguaggio di programmazione lato PC che usi, e non è un argomento strettamente legato ad arduino, su computer si possono usare tantissimi linguaggi di programmazione e quindi per risolvere problemi lato computer servirebbe un intero forum dedicato a vari linguaggi.

Il tuo problema lo dovresti porre su forum di programmazione, però hai fatto una domanda "esistono linguaggi che consentono..." il linguaggio che conosci meglio sicuramente ti aiuta a risolvere la maggior parte dei problemi, ma a livello generare ci sono linguaggi, opinione personale "più semplici" per applicazioni windows, esempio i linguaggi VB.NET E C#.NET, esempio puoi creare interfacce grafiche facilmente, se poi vorresti aprire un file audio con il programma predefinito su il tuo pc. basterebbe una riga di codice,

Esempio C#

Process.Start("PercorsoENomeProgramma.exe", "percorsoNomeFile");

Per gestire la serial port, esistono apposite Classi o controlli

La cosa una volta imparata è semplice, ma per impararla occorre un po di tempo.

Sicuramente c'è un qualche metodo per fare FLUSH del file senza chiuderlo. Solitamente preferisco gestire i file in stile C anche nel C++, in tal caso la funzione è fflush().

Un linguaggio alternativo che puoi usare, che io consiglio fortemente, è Python. C'è una libreria, pySerial, che ricorda vagamente la Serial di Arduino, tra l'altro.

SukkoPera:
Un linguaggio alternativo che puoi usare, che io consiglio fortemente, è Python.

Sicuramente si, conosco molto poco Python però ho visto che ci si possono fare belle cose. :slight_smile:

Grazie mille per le risposte ragazzi.
Allora io ho scelto il C++ perché è il linguaggio che ho studiato sia alle superiori che all'università, quindi è quello che conosco meglio.

Processing a volte lo uso, ma lo preferisco per programmi che hanno più una specifica grafica che altro. In questo caso (almeno per ora) non mi serve un interfaccia grafica.

VB e C# non li conosco ma vedendo già solo quella riga di esempio, il c# diventa interessante :grin:

Per quanto riguarda python, so per sentito dire che è molto buono ma l ho usato in un piccolo progetto all'università e l ho praticamente odiato. Ho avuto tantissimi problemi solo perché delle istruzioni non erano indentate per bene e altri problemi dovuti ovviamente al fatto che non lo conosco.

Quindi a questo punto ho capito che il c++ non è il più conveniente, soprattutto se più in là volessi aggiungere una GUI.

Proverò a fare uno stesso programma iniziale sia in python, sia in processing e sia in c# per vedere un po'.. :roll_eyes:

salvatore_94:
Quindi a questo punto ho capito che il c++ non è il più conveniente, soprattutto se più in là volessi aggiungere una GUI.

Sicuro di questa tua affermazione ?
Questa è una GUI che ho sviluppato diversi anni fa per gestire un analizzatore di stati logici, è scritta totalmente in C++, compilatore cBuilder 6 :slight_smile:

VB e C# non li conosco ma vedendo già solo quella riga di esempio, il c# diventa interessante :grin:

Ciao, ovviamente il C# è C like, quindi le strutture di controllo la sintassi e le regole non differiscono molto dal C/C++, poche differenze che si imparano in poco tempo, di conseguenza devi imparare soprattutto le classi disponibili e i loro metodi, e qui visto l'ampiezza del framework.net può richiedere molto tempo, ma se uno impara di volta in volta quello di cui ha bisogno "metodo che adotto :)" si diviene produttivi in poco tempo...

Beh ... per queste cose, IMBATTIBILI e senza confronto, sono LabView™ e LabWindos/CVI™ di National Instruments ... peccato che, salvo per le versioni "student", per le altre ... tocca fare un mutuo :money_mouth_face: :money_mouth_face: :money_mouth_face:

Guglielmo

gpb01:
per le altre ... tocca fare un mutuo :money_mouth_face: :money_mouth_face: :money_mouth_face:

Ed è il motivo per cui non uso Labwindows e Labview. :slight_smile:

C# è molto (ma molto molto!) simile a Java, o almeno lo era l'unica volta che ci ho avuto a che fare, ma erano diversi anni fa.

Se vuoi fare GUI in C++, e/o semplificarti parecchio la vita con questo linguaggio in generale, c'è qualcosa che fa al caso tuo e che ti tornerà sicuramente utile in ambito lavorativo: qt.

Quanto a Python, la colpa dei problemi è tua non sua: usare BENE l'indentazione è cosa buona e giusta, e il fatto che in Pyhon sia OBBLIGATORIO non dovrebbe essere un impedimento, ma una cosa naturale ;).

PS: Nota che tutto quello che ti ho suggerito è cross-platform, è bene pensare anche a questo aspetto.

astrobeed:
Ed è il motivo per cui non uso Labwindows e Labview. :slight_smile:

Ti capisco, ma ormai, in ambiente industriale, laboratori di ricerca, militari, ecc. ecc. ... sono diventati uno standard di fatto ! Anzi ... LabView™ è diventato LO standard, LabWindows/CVI (... che io amo molto di più essendo ANSII C) è sempre meno usato :frowning:

Guglielmo

C# è molto (ma molto molto!) simile a Java

Si infatti, probabilmente nato per concorrere con il java, io ho parlato di C/C++ perché è un linguaggio che conosce e con cui può fare confronti, dire che è simile al java serve solo se si conosce il java :slight_smile:

Sì, ma se C# è ancora simile a Java quanto lo era una volta, le somiglianze con il C/C++ sono meramente sintattiche, perché la logica di utilizzo poi è radicalmente diversa e le librerie standard hanno interfacce totalmente diverse.

Non per fare il guasta feste, ma vi rendete conto che state disquisendo tra linguaggi profondamente diversi tra loro dicendo sono simili, ovviamente la similitudine deriva dal paradigma OO. C/C++ sono linguaggi statici compilato dal compilatore in codice macchina nativa, mentre java, python (e mi pare anche C#) generano codice byte compilato che poi viene eseguito da una macchina virtuale. Inoltre il linguaggio si sceglie in base alla applicazione da sviluppare e alla portabilità che si vuole avere, idem per le librerie di terze parti. Ad esempio con Qt si ha portabilità teorica potenzialmente alta, ma meno che con java, principalmente perché in C/C++ devi interfacciarti con le API di sistema e pertanto si devono conoscere le API di windows, apple e unix (o unix like).

Per Apple e Unix like benché si dice siano simili (non ho mai avuto un Apple) penso che per come ci sono differenze tra unix, linux e BSD ci saranno anche per Apple.

Dicevo prima che, si scegli il linguaggio in base alla applicazione che si intende sviluppare, in particolare mi riferisco al fatto che in C/C++ si ottiene la massima velocità di esecuzione possibile che impiegando linguaggi byte compiled, quindi se devo realizzare un kernel grafico 3D e voglio sfruttare al meglio il PC non ho altra scelta che il C/C++, diversamente mi devo accontentare di usare il linguaggio che conosco meglio, sfruttarlo al meglio e sperare che la VM non limiti le prestazioni eccessivamente.

Un'altra riflessione sotto forma di domanda: é più produttivo (sensato) scegliere un linguaggio specifico per ogni applicazione? oppure scegliere un linguaggio studiarlo al punto da saperlo sfruttare al meglio e usarlo per qualunque applicazione?

Io ho fatto la seconda scelta ma solo perché mi sono scocciato di studiare altri linguaggi. :smiley:

MauroTec:
Un'altra riflessione sotto forma di domanda: é più produttivo (sensato) scegliere un linguaggio specifico per ogni applicazione? oppure scegliere un linguaggio studiarlo al punto da saperlo sfruttare al meglio e usarlo per qualunque applicazione?

Più che altro dipende da che tipologia di software devi scrivere, se lavori nel mondo del gestionale non ci sono grossi problemi di velocità, meglio orientarsi verso linguaggi di alto livello che consentono di scrivere rapidamente il codice e ben dotati di strumenti per la gestione di database e accesso alla rete.
Se lavori nel mondo scientifico meglio orientarsi su linguaggi che consentono sia di sfruttare bene la velocità della macchina che essere produttivi, serve anche un buon supporto per interfacciarsi con l'hardware.
Se lavori nel campo della automazione allora la scelta è obbligatoria, C/C++ perché sono gli unici linguaggi che ti permettono di fare tutto, però al costo della produttività che è decisamente minore di quella offerta da altri linguaggi.
Su pc, a seconda di quello che devo fare, uso il C++ oppure Delphi, in realtà è una suite unica perché lavoro con Rad Studio di Embarcadero (ex Borland) che racchiude i due compilatori un ambiente unificato con strumenti in comune e, sopratutto, librerie e componenti aggiuntivi comuni.
Da non molto ho iniziato ad usare Processing perché è comodo per realizzare rapidamente semplici GUI su i sistemi Linux Embedded, dotati desktop grafico, senza stare a scomodare le QT (che uso spesso e volentieri), ma anche per realizzare semplici app per Android.

Ragazzi grazie mille per le risposte, non ho risposto perché sono stato occupato con un esame.
Ho provato a fare un piccolo programma in processing che leggeva da seriale e faceva partire un file audio. La parte della comunicazione seriale e della gestione del file audio è davvero molto semplice, bastano poche righe di codice. Ma purtroppo è un po' scocciante in alcune cose semplici, come l'inserimento da tastiera di una stringa o di un dato. Essendo un linguaggio orientato più alla grafica, prima di poter inserire una lettera da tastiera devi crearti il campo dove inserire e così via.
Dato che al momento non ho bisogno di una intefaccia grafica avrei pensato di usare il C/C++ dato che comunque il programma dovrà girare solo su windows.

Per ora purtroppo quello che voglio fare è ancora troppo vago, non ho ancora ben stabilito cosa fare e non, quindi una volta che decido allora vedrò se farlo in C/C++ o in processing, sono i due linguaggi che conosco di più e che preferisco al momento. (poi magari quando alla magistrale farò java me ne pentirò ::slight_smile: )

salvatore_94:
prima di poter inserire una lettera da tastiera devi crearti il campo dove inserire e così via.

Questo vale per qualunque ambiente di programmazione che lavora su un desktop grafico, se primi non crei un campo di input come pensi di poter introdurre i dati ?