Ciao ragazzi sto avendo dei problemi nel creare una doppia comunicazione seriale con arduino e il pc. mi serve perchè ho la necessità di far comunicare Arduino con due programmi differenti del pc e ovviamente con una non riesco poichè se apro la comunicazione con un programma si esclude inevitabilmente l'altro.
Ho seguito questa guida Arduino, Max232 e comunicazione seriale – Parte 1 | Tecnicamente's Weblog ma senza risultati.
Chiedo se è possibile fare una cosa del genere o meglio se qualcuno l'ha mai fatto. Sul web non c'è molto.
Vi ringrazio in anticipo!
OVVIAMENTE... un solo programma alla volta può accedere alla porta seriale, e guai se non chiude la connessione prima di uscire (rimane appesa).
Quindi non si può.
Devi avere due porte seriali distinte e comunicare su due canali differenti, ciascuno per il suo programma lato PC. (Es. COM11 e COM14)
Si non si può fare con un'unica comunicazione seriale che va da arduino al pc. Ma è possibile crearne due ed usarle contemporaneamente?
Con l'integrato MAX232 si può creare una seconda porta seriale quindi usando una porta COM differente sul pc..
Il MAX232 lo connetti a una porta COM gia' esistente sul PC e ti fa' solo da adatatore di livelli.
Se ti manca una seconda seriale sul PC, devi prendere un convertitore USB-Seriale ( TTL cosi' non ti serve il MAX232 )
ad esempio Questo
A me non manca una seconda seriale sul pc, ma ho bisogno di far comunicare Arduino con due programmi sul pc per questo con una seriale non ce la posso fare, quindi chiedo se è possibile creare una seconda seriale (ovvero una seconda comunicazione tra arduino e il pc)
La soluzione si chiama ... "SoftwareSerial" ... così hai una seconda porta seriale su Arduino e, con i dovuti adattatori di livello (MAX232), l'attacchi alle due porte sul PC.
Guglielmo
Sei io collego questa Convertitore RS232 USB TTL con CP2102 ad arduino con la libreria softwareSerial sarei già al completo?
Cioè creando con SoftwareSerial la seconda seriale e poi collegare i pin rx e tx al convertitore ho già instaurato la comunicazione seriale?
Quello è un convertitore serial (Arduino) <--> USB PC ... tu hai porte USB o porte seriali RS232 ?
Se hai le USB la risposta è SI.
Attenzione hai pin che usi per la SoftwareSerial dato che, in funzione del modello di Arduino, alcuni non possono essere usati (come scritto nella documentazione).
Guglielmo
Perfetto.. Grazie. Quali non posso essere utilizzati?
... come detto, dipende dalla board (UNO, Leonardo, Mega2560, ...) ... se leggi la pagina che ti ho linkato c'è spiegato
Guglielmo
Sto utilizzando Arduino UNO
ne prendiamo atto
forse la soluzione ottimale è quella di appoggiarsi ad un servizio/demone che gestisca il protocollo e smisti i pacchetti ai vari programmi.
ecco questa e' interessante, il che permetterebbe di usare una sola seriale.
Conosci demoni opensource da cui attingere per prendere spunto di scrittura ? oppure programmi gia' fatti solo da configurare ?
Hai il tuo primo Karma
dato che parli di demoni presumo tu sia sotto unix, no cosi specifici non li conosco ma il tutto è relativamente semplice da scrivere.
Il demone comunica con Arduino tramite seriale e con le app tramite pipe o unix socket, dovrà dunque gestire due buffer circolari che manterranno in memoria i dati ricevuti da Arduino.
Il tutto si traduce in un centinaio di righe di codice a seconda del linguaggio tu voglia usare, tecnicamente se ben progettato potresti anche usare lo script bash per creare questo genere di demone.
Sarebbe quindi il caso di indicare il s.o. che si sta utilizzando, i linguaggi conosciuti, le applicazioni chi le ha scritte e una bozza del protocollo.
p.s. grazie per il karma.
In genere uso windows, ma parlare di demoni invece che di servizi fa più effetto.
A me non serve ad oggi un programma del genere ma mi piace l'idea che hai dato.
Quindi se ho capito sul flusso seriale si andrà ad interpretare quali messaggi sono per luna e quali per l'altra applicazione. Questo lo si dovrebbe fare facilmente.
Non ho esperienza invece delle metodologie possibili da usare per smistare i dati dai due ring buffer alle due app. Per socket intendi qualcosa tipo i socket di rete tcp/ip ?
I demoni non sono una parola d' effetto per indicare i servizi, ma più semplicemente sono come chiama i servizi il mondo unix.
Ora almeno so di che sistema operativo stiamo parlando.
Si potresti usare benissimo anche i socket TCP/IP, o le pipe oppure dato che sei su windows potresti usare una libreria condivisa, non sapendo però il linguaggio ed il protocollo non riesco ad indirizzarti verso uno di questi IPC.
Proprio per questo mischio le cose parlando di demoni su windows, io scherzo sempre, poi imparerai a conoscermi, ed in genere questo coincide anche con l'odiarmi
Tornando seri, facciamo un esempio:
1- Win7
2- C/C++ con VisualStudio gratuito
3- flusso da monitorare seriale su virtual com via usb
4- belli i tuoi lavori in firma, sto seguendo easyframework. Utilizzabile in questo contesto ?
Bene adesso so anche quale linguaggio conosci.
Manca solo il protocollo.........
Sarebbe utile sapere chi è il master e chi lo slave, ovvero, se il PC è il master e Arduino lo slave la comunicazione avviene cosi:
PC -> richiesta -> Arduino
Arduino -> risposta -> PC
Loop
Invece se Arduino è il master:
PC -> wait Arduino
Arduino -> Send Data
Loop
Questo fattore è importante perchè nel primo caso potresti anche non aver bisogno di un servizio che gestisca le applicazioni ma basterebbe ad esempio un MUTEX con nome per la mutua esclusione dell'utilizzo della seriale.
Nel secondo caso invece hai la necessità di un servizio che non perda e smisti i messaggi.
4- L'EF è per linux, anche se la versione 0.0 e 0.1 erano presenti anche per windows ormai ho deciso di non fare piu il porting causa il pochissimo tempo che ho a disposizione.
Comunque si sarebbe stato utilissimo, ho scritto un programma che fa eseguire i comandi ad arduino (presente firmata?) l'accesso alla seriale viene appunto sincronizzato da un Named Mutex il tutto fa largamente uso dell' EF.Ora sto scrivendo un driver che permetta di utilizzare una scheda arduino direttamente dentro linux, presente Raspberry con i suoi gpio? bene lo sto facendo con arduino: echo "1" > /sys/class/arduIO/d13/value.