View Full Version : [C++] Creare una classe per inviare comandi su un cavo seriale ad una pinza
DomusP45
09-02-2012, 14:43
Ragazzi,
mi appello alla vostra disponibilità per chiedervi questa cosa:
Devo creare una classe per la gestione di una pinza elettrica della Schunk connessa via seriale al PC, in C++.
Devo fare tutto da zero, e sinceramente non so proprio come partire...perchè il docente mi ha detto di cercare in rete la libreria da includere per le comunicazioni seriali (ovviamente da usare come output)...
Qualcuno sa consigliarmi quale libreria usare? Mi postate un link da dove scaricarla?
Considerate che devo usare un pc con Ubuntu e NetBeans IDE come ambiente per scrivere la classe ed il relativo programma che la usi...ed è un ambiente che non conosco affatto...visto che per gli esami, abbiamo usato il DevCpp e vi lascio immaginare quanto sia pessimo per fare una cosa del genere...
Qualcuno sa come aiutarmi?
Se il sistema operativo è Linux te la cavi senza nessuna libreria esterna: la seriale è solo un file (tipicamente "/dev/ttyS0") speciale. Quello che ci scrivi viene sparato sulla seriale fisica, quello che arriva sulla seriale fisica lo puoi leggere sempre dal file.
La cosa si complica un pelo se devi settare i parametri della seriale (parità, velocità ecc).
ciao!
DomusP45
09-02-2012, 15:33
Se il sistema operativo è Linux te la cavi senza nessuna libreria esterna: la seriale è solo un file (tipicamente "/dev/ttyS0") speciale. Quello che ci scrivi viene sparato sulla seriale fisica, quello che arriva sulla seriale fisica lo puoi leggere sempre dal file.
La cosa si complica un pelo se devi settare i parametri della seriale (parità, velocità ecc).
ciao!
esatto...io devo mandare a questa pinza codici con ACK, STOP, APRI, CHIUDI...insomma devo mandare comandi e ricevere "flag" di risposta...
Il sistema da cui verrà lanciato è Linux con Patch RealTime perchè il robot a cui questa pinza è collegata ha bisogno di istruzioni ogni 2millisecondi...
come posso fare? Per questo mi hanno detto che serve la libreria...
esatto...io devo mandare a questa pinza codici con ACK, STOP, APRI, CHIUDI...insomma devo mandare comandi e ricevere "flag" di risposta...
Il sistema da cui verrà lanciato è Linux con Patch RealTime perchè il robot a cui questa pinza è collegata ha bisogno di istruzioni ogni 2millisecondi...
come posso fare? Per questo mi hanno detto che serve la libreria...
Intanto che patch realtime usi ? Xenomai ? RTAI ? Altro ?
A seconda delle patch probabilmente cambia la fase di configurazione (o nel caso migliore, i parametri). Anche per le letture e scritture potrebbe essere cosi' (con qualche eccezione).
DomusP45
09-02-2012, 16:16
Intanto che patch realtime usi ? Xenomai ? RTAI ? Altro ?
A seconda delle patch probabilmente cambia la fase di configurazione (o nel caso migliore, i parametri). Anche per le letture e scritture potrebbe essere cosi' (con qualche eccezione).
ecco, questa cosa non la so...è il pc del laboratorio di ingegneria...io dovrò lavorare comunque a casa prima....poi andare là e provare...
mamma mia...cominciano a venirmi le crisi! :(
ecco, questa cosa non la so...è il pc del laboratorio di ingegneria...io dovrò lavorare comunque a casa prima....poi andare là e provare...
mamma mia...cominciano a venirmi le crisi! :(
Ci sara' qualcuno in lab che ha lavorato su quel pc prima di te, penso. Prova a sentire in laboratorio, e' la strada piu' semplice per partire secondo me.
In ogni caso a meno che non abbiate un simulatore o un qualcosa di analogo farai una fatica enorme a lavorare da casa secondo me (a parte forse la fase iniziale).
DomusP45
09-02-2012, 16:49
Ci sara' qualcuno in lab che ha lavorato su quel pc prima di te, penso. Prova a sentire in laboratorio, e' la strada piu' semplice per partire secondo me.
In ogni caso a meno che non abbiate un simulatore o un qualcosa di analogo farai una fatica enorme a lavorare da casa secondo me (a parte forse la fase iniziale).
EDIT: Allora ecco la situazione.
Per il momento io devo solo creare la classe C++ che mi permetta di inviare comandi su una porta seriale e leggere la risposta di ritorno dalla seriale.
Il realtime per il momento non interessa. In laboratorio non mi dicono granchè su come si fa, perchè ovviamente non vogliono visto che devo farlo io....
Allora io vi chiedo a voi delle delucidazioni:
- Mi hanno detto che devo usare una libreria di comunicazione seriale, da includere nella classe. Quale uso (ovviamente su sistema linux ubunthu)? Quale mi consigliate?
- Devo creare una classe che abbia due funzioni, una di comunicazione con la pinza e l'altra che gestisca gli errori. Però devo creare dei metodi più semplici (nei vari casi di parametri da inviare) che vengono poi richiamati dalla funzione di comunicazioni...praticamente quello che devo mandare alla pinza sono istruzioni in un buffer che deve essere così composto:
D-Len [0x05]
Cmd [0xB0]
Param [0x00 0x00 0x20 0x41]
(questo è un esempio di parametro)
Allora, D-Len sta per Data Lenght è può trasferire massimo 255 bytes
Cmd è il tipo di comando
Param sono i parametri da dare.
Che tipo di dato devo usare per fare un buffer di questo tipo? Come si fa un buffer?
DomusP45
14-02-2012, 11:23
EDIT: Allora ecco la situazione.
Per il momento io devo solo creare la classe C++ che mi permetta di inviare comandi su una porta seriale e leggere la risposta di ritorno dalla seriale.
Il realtime per il momento non interessa. In laboratorio non mi dicono granchè su come si fa, perchè ovviamente non vogliono visto che devo farlo io....
Allora io vi chiedo a voi delle delucidazioni:
- Mi hanno detto che devo usare una libreria di comunicazione seriale, da includere nella classe. Quale uso (ovviamente su sistema linux ubunthu)? Quale mi consigliate?
- Devo creare una classe che abbia due funzioni, una di comunicazione con la pinza e l'altra che gestisca gli errori. Però devo creare dei metodi più semplici (nei vari casi di parametri da inviare) che vengono poi richiamati dalla funzione di comunicazioni...praticamente quello che devo mandare alla pinza sono istruzioni in un buffer che deve essere così composto:
D-Len [0x05]
Cmd [0xB0]
Param [0x00 0x00 0x20 0x41]
(questo è un esempio di parametro)
Allora, D-Len sta per Data Lenght è può trasferire massimo 255 bytes
Cmd è il tipo di comando
Param sono i parametri da dare.
Che tipo di dato devo usare per fare un buffer di questo tipo? Come si fa un buffer?
EDIT: Allora ecco la situazione.
Per il momento io devo solo creare la classe C++ che mi permetta di inviare comandi su una porta seriale e leggere la risposta di ritorno dalla seriale.
Il realtime per il momento non interessa. In laboratorio non mi dicono granchè su come si fa, perchè ovviamente non vogliono visto che devo farlo io....
Allora io vi chiedo a voi delle delucidazioni:
- Mi hanno detto che devo usare una libreria di comunicazione seriale, da includere nella classe. Quale uso (ovviamente su sistema linux ubunthu)? Quale mi consigliate?
- Devo creare una classe che abbia due funzioni, una di comunicazione con la pinza e l'altra che gestisca gli errori. Però devo creare dei metodi più semplici (nei vari casi di parametri da inviare) che vengono poi richiamati dalla funzione di comunicazioni...praticamente quello che devo mandare alla pinza sono istruzioni in un buffer che deve essere così composto:
D-Len [0x05]
Cmd [0xB0]
Param [0x00 0x00 0x20 0x41]
(questo è un esempio di parametro)
Allora, D-Len sta per Data Lenght è può trasferire massimo 255 bytes
Cmd è il tipo di comando
Param sono i parametri da dare.
Che tipo di dato devo usare per fare un buffer di questo tipo? Come si fa un buffer?
con l'linux usare una seriale è facile, non devi fare altro che trattarla come se fosse un comune file (file periferica /dev/ttysx) da cui leggi e scrivi non ti serve nessuna libreria
DomusP45
14-02-2012, 11:32
con l'linux usare una seriale è facile, non devi fare altro che trattarla come se fosse un comune file (file periferica /dev/ttysx) da cui leggi e scrivi
si, questo l'ho capito...quello che purtroppo non so è quale libreria usare, perchè la classe deve funzionare indipendentemente da dove giri poi...quindi ok che uso linux, però devo farla in modo che funzioni anche senza linux...insomma, dicono che farla che scriva semplicemente su un file non va bene...devo usare la libreria di comunicazione seriale...e sinceramente non so quale usare...ne ho scaricata una "cport" qualcosa...
Se avete qualche altra da consigliarmi...
Per il fatto del buffer invece, come faccio? String? Devo creare un vettore o no?
si, questo l'ho capito...quello che purtroppo non so è quale libreria usare, perchè la classe deve funzionare indipendentemente da dove giri poi...quindi ok che uso linux, però devo farla in modo che funzioni anche senza linux...insomma, dicono che farla che scriva semplicemente su un file non va bene...devo usare la libreria di comunicazione seriale...e sinceramente non so quale usare...ne ho scaricata una "cport" qualcosa...
Questo fa abbastanza a pugni con quanto dicevi prima:
Il sistema da cui verrà lanciato è Linux con Patch RealTime perchè il robot a cui questa pinza è collegata ha bisogno di istruzioni ogni 2millisecondi...
Hai quindi interesse a farlo che sia cross-platform ? Deve girare su sistemi unix generici ? Deve girare anche sotto windows ?
In quest'ultimo caso la soluzione migliore e' scriverti una serie di classi differenti, ad esempio una che wrappi le chiamate per la seriale sotto linux, a cui poi aggiungerai con calma una (con medesima interfaccia) che wrappa le chiamate per linux realtime (le chiamate sono fondamentalmente le stesse, ma cambia potenzialmente l'inizializzazione) e una per quelle windows. In questo caso scrivere sulla seriale vuol dire usare le chiamate della libreria standard per aprire il device (come un file) e per scriverci i dati (come su un file). Niente librerie esterne.
In alternativa puoi usare una libreria come boost-asio, pero' non so quanto facile sia poi usarla per l'ambiente real-time.
DomusP45
14-02-2012, 11:57
In alternativa puoi usare una libreria come boost-asio, pero' non so quanto facile sia poi usarla per l'ambiente real-time.
Allora, il problema è questo. Scusatemi per la confusione del realtime, ma hanno sbagliato loro a dirmelo inizialmente.
Il sistema su cui girerà questa benedetta classe sarà il computer linux collegato al robot che avrà questa pinza connessa.
La pinza va gestita con pc con linux via porta seriale e non realtime a quanto ho capito, mentre il robot viene gestito con un altro pc per fatti suoi (che è ovviamente realtime).
Devo scrivere una classe usando come ide NetBeans, che abbia i metodi per le varie funzioni della pinza, e due macro funzioni: una per la gestione della comunicazione e l'altra per gestione degli errori di ritorno dalla pinza.
Il docente ha chiesto esplicitamente che sia fatta usando una libreria di comunicazione seriale, NON MI CHIEDETE PERCHE'....fatto sta che devo farla così.
Ha detto che sulla rete ci stanno caterbe di librerie (ed è vero) e che io ho libertà su quale usare. Fatto sta che sono cose che non ho mai fatto prima...nel senso che pure in quanto a classi, negli esami di programmazione abbiamo fatto cose semplici (CLASS PERSONA--SOTTOCLASSE STUDENTE, LAVORATORE) che ovviamente fanno ridere a confronto con questa.
Sono anni che non mi dedico alla programmazione perchè ho avuto tutti gli altri esami da fare, e quindi ora mi trovo spaesato. Ho capito cosa vuole...ma non so come farlo. NOn l'ho mai fatto.
Insomma, so che sotto linux la porta seriale è vista come un file e ci si può scrivere direttamente...ma il docente vuole che utilizzi una libreria per comunicare sulla seriale e usi le funzioni della libreria per comunicare.
Quindi, visto che non l'ho mai usate, qualcuno sa dirmi qualcosa in merito? Conosce qualche libreria da consigliarmi?
Come posso poi strutturare un buffer per le istruzioni da inviare, che siano in quel formato che vi ho scritto?
Scusatemi per la confusione, ma sono nella fase iniziale di "roadmap" per capire insomma cosa devo fare e come...
DomusP45
15-02-2012, 10:28
faccio un up anche per chiedere che simulatore usare per leggere un output della porta seriale dal programma che farò...
dicono che esistono simulatori di porte seriali....se me sapete consigliare uno ne sarei molto felice!
faccio un up anche per chiedere che simulatore usare per leggere un output della porta seriale dal programma che farò...
dicono che esistono simulatori di porte seriali....se me sapete consigliare uno ne sarei molto felice!
io uso free serial port monitor
DomusP45
15-02-2012, 19:25
io uso free serial port monitor
puoi postarmi un link da dove si scarica? è per linux, vero?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.