Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    260

    [C#] Più thread che scrivono e leggono su un'unica serial port

    Ciao a tutti.
    Ho un programma che gestisce una serial port per comunicare con un PLC (in parole povere un hardware dedicato che controlla una catena di montaggio).
    Il mio programma può ricevere la richiesta di vari comandi anche simultaneamente. Per questo motivo resta in attesa di questi comandi con vari thread, una volta ricevuto il comando impartisce l'ordine al PLC andando a scrivere sulla porta seriale e attendendo poi la relativa risposta. Il problema è che questi comandi che il mio programma riceve possono arrivare nello stesso momento e qui succede il casino: fra la scrittura e la lettura del comando A si può inserire la scrittura del comando B scombussolando tutto.

    Come posso risolvere?

    Per la lettura da seriale uso l'handler di serialPort: DataReceived

    grazie mille

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In questo contesto la seriale rappresenta una risorsa unica da "bloccare" prima di essere usata.

    L'accesso deve essere ottenuto tramite un oggetto di sincronizzazione (un mutex ad esempio) e il thread che ottiene il mutex dialoga con la seriale. Gli altri attendono.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    260
    Quote Originariamente inviata da oregon Visualizza il messaggio
    In questo contesto la seriale rappresenta una risorsa unica da "bloccare" prima di essere usata.

    L'accesso deve essere ottenuto tramite un oggetto di sincronizzazione (un mutex ad esempio) e il thread che ottiene il mutex dialoga con la seriale. Gli altri attendono.
    Nello specifico ho 2 thread, A e B.

    Il Thread A fa spesso delle scritture e con l'evento DataReceived aspetta la rispettiva risposta.
    Ogni tanto B fa pure lui scritture/letture sempre con il DataReceived (penso crei un ulteriore thread di attesa su qualcosa che arriva sulla seriale).

    A livello pratico come dovrei usare il mutex? uso proprio l'oggetto System.Threading.mutex?

    grazie

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    260
    Quote Originariamente inviata da oregon Visualizza il messaggio
    ho provato ad usare tale oggetto, con scarsi risultati.

    Ho creato un oggetto statico mutex nella mia classe che controlla la porta seriale.

    Poi nei due thread, dove uso la classe seriale in questione, ho messo un mutex.wait prima e un mutex.release

    Pero' tramite le stampe a video vedo che il 2o thread parte lo stesso anche se la release dell'altro thread non è ancora chiamata.


    Cosa sbaglio?

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    L'istanza di Mutex è la stessa per entrambi i thread?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Nell'esempio che ho visto non viene usato mutex.wait e mutex.release, ma bensì mutex.WaitOne e poi mutex.ReleaseMutex, sicuro di aver seguito bene l'esempio ??

    Sergio

  8. #8
    Io ho affrontato la stessa cosa per il mio telescopio. Nel mio caso ho un thread che comunica con la porta seriale e preleva le richieste sotto forma di pacchetti da uno stack thread safe che mi sono creato e che viene popolato in modo asincrono dagli altri thread. A turno tutte le richieste vengono processate, una dopo l'altra. Dal momento che vari software potevano pilotare la montatura del mio telescopio ho usato un'architettura client/server TCP/IP.
    Il mio sito e blog: http://www.montagnamarco.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.