PDA

Visualizza versione completa : [c] multithread e porta seriale - RISOLTO con DUBBIO


Gergio
17-11-2005, 17.00.07
Ciao, sto scrivendo un'applicazione (ambiente linux) che permetta la comunicazione tra 2 dispositivi attraverso la porta seriale.
Fino a un paio di giorni fa ero riuscito, grazie alla funzione SELECT a scrivere sulla porta e nel contempo ad avere un loop continuo per l'ascolto della porta.
Dato che il protocollo dei 2 dispositivi prevede che il dispositivo remoto riceva delle stringhe ogni 2 secondi per mantenere attiva la comunicazione, ho pensato di aggiungere un thread concorrente che scrivesse la stringa sulla seriale ogni 2 secondi.
Compilo, lancio l'esecuzione, aspetto che i 2 dispositivi si riconoscano e poi parte il thread concorrente. Purtroppo nn fa qllo che spero: manda semplicemente una serie di caratteri INVIO (o A CAPO, dovrei verificare) finche' l'applicazione crasha con un messaggio di "segmentation fault".
Da ql momento nn sono piu' riuscito a far andare la mia applicazione: anche se tolgo la parte relativa al multithreading, il comportamento e' sempre lo stesso. Anche se provo con versioni vecchie (e sicuramente funzionanti): lancio l'eseguibile, il cursore si muove un po' sullo schermo e dopo un 2-3 secondi segmentation fault
Ho creato un file di testo in cui metto tutto qllo che arriva dalla seriale e ho visto che vengono inviati solo caratteri INVIO.
Ho provato a ricompilare, a riavviare il sistema e lanciare subito l'eseguibile di una vecchia versione: sempre lo stesso errore.
Ho provato a far girare un'altra applicazione con multithread (senza coinvolgere la seriale) e funziona senza problemi. Anche minicom funziona senza problemi, ma la mia applicazione no.

Cosa puo' essere successo? Cosa posso controllare?

Gergio
18-11-2005, 15.51.44
aggiornamento

trovato e corretto un errore: la creazione del thread concorrente avviene all'interno di un loop. Prima mancava il controllo che consentisse la creazione di un solo thread, per cui a ogni ciclo (credo) veniva creato un nuovo thread.
Il problema, cmq, persiste.

Gergio
21-11-2005, 17.21.08
risolto

dopo vari tentativi ho provato ad aumentare il buffer associato alla porta seriale ed e' andato tutto a posto.

Mi rimane un dubbio: perche' anche le versioni vecchie del mio programma (e qndi gia' compilate e funzionanti) nn funzionavano piu'?

Sergio Neddi
21-11-2005, 22.21.03
Potrebbe essere che le impostazioni della seriale (quelle impostate dal sistema) siano cambiate.

Gergio
22-11-2005, 09.42.58
Grazie per la risposta :)

Nn saprei: in avvio del mio sw salvo le impostazioni correnti della porta, gli applico le mie impostazioni e in chiusura gli riapplico le impostazioni originarie.
D'accordo che se il programma termina con un errore run time nn posso riapplicargli le impostazioni originarie, ma le mie impostazioni in apertura dovrebbero essere correttamente impostate.

Nn so che pensare, ma adesso funziona :confused:

Magari adesso provo a giocare un po' con il buffer per vedere se ci capisco qlcosa...

danieleb
06-12-2005, 15.40.18
A me non interessa il contenuto dell'allegato, solo il nome e il fatto che c'è. Mi serve perchè rimanga traccia del fatto che, insieme al messaggio e-mail, c'era appunto un allegato, indipendentemente dal tipo/contenuto.

Gergio
06-12-2005, 16.23.33
in effetti anche a me nn interessa il contenuto dell'allegato...

:p

danieleb
06-12-2005, 16.30.00
Ooops!! scusa, ho sbagliato a postare !!!
Comunque ho avuto anch'io a che fare con le porte seriali e, ovviamente, ho avuto problemi, ho saputo anche che su alcuni PC la porta seriale è solo simulata, in realtà si tratta di una porta USB camuffata, inoltre potresti avere problemi a causa di buffer (hardware o software) non correttamente svuotati e/o inizializzati... Perlomeno questi erano i problemi che ho riscontrato dovendo gestire quella porta....

Gergio
06-12-2005, 16.34.09
la mia era solo una battuta
cmq grazie dei consigli ;)

ciocgun
16-02-2008, 10.53.07
è un po tardi ma mi permetto di segnalarti questi 4 tutorial fatti da un amico
http://www.codicefacile.it/tutorials/tutorials.php/21/Cenni+ di+programmazione+multi-threading
http://www.codicefacile.it/tutorials/tutorials.php/22/Cenni+ di+programmazione+multi-threading+-+parte+2
http://www.codicefacile.it/tutorials/tutorials.php/39/Cenni+ di+programmazione+multi-threading+-+parte+3
http://www.codicefacile.it/tutorials/tutorials.php/41/Cenni+ di+programmazione+multi-threading+-+parte+4