Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Comunicazione Seriale

    Ciao a tutti,

    sto riprendendo in mano l'applicazone, di cui già scrissi tempo fa, che permette la comunicazione con la porta seriale.

    Ora sto cercando di implementare un applicazione asincrona (overlapped), ovvero vorrei che leggesse dalla seriale solo quando arriva un carattere nel buffer della USART. Ho scritto il codice che riesce a soddisfare questo obiettivo, premetto che è la prima volta che sbatto la testa con le strutture Overlapped.
    Codice PHP:
     while(1)
      {
      if ( !
    WaitCommEvent(Porta_Seriale, &buffer, &OverlapStruct)) 
       {
         if(
    GetLastError()== ERROR_IO_PENDING);
          
    printf("I/O pending...");
        
       }
      if(
    WaitForSingleObject(OverlapStruct.hEvent,INFINITE)==WAIT_OBJECT_0)
      {
      do
       {
         
    ReadFilePorta_Seriale,&car,sizeof(car),&BytesRead,&OverlapStruct);
         
    printf("%c",car);
         
    Sleep(2);
       }while (
    BytesRead );   
      }
      
      
    ResetEvent(OverlapStruct.hEvent);
      
      } 
    Il codice è stato testato inviando dei dati da microcontrollore ed effettivamente, ogni volta che il micro trasmetteva, il programma stampava a video la stringa corretta.
    Il mio problema nasce dal fatto che io vorrei anche scrivere sulla seriale, ma non saprei come fare. Devo forse creare un thread che si occupi dell'ascolto della porta, mentre il programma principale si occupa dell invio dei dati sulla stessa porta? Ci può essere una soluzione alternativa all uso dei thread (argomento per ora da me mai trattato)?.
    Qualcuno saprebbe darmi una traccia del percorso da seguire?

    Grazie a tutti per l attenzione.

    Saluti!




  2. #2
    Il mio problema nasce dal fatto che io vorrei anche scrivere sulla seriale, ma non saprei come fare.
    Potresti creare una variabile "coda", inizialmente vuota, che controlli ad ogni ciclo compiuto dal while. Se la coda è vuota continui come se nulla fosse, altrimenti prendi i dati in essa contenuti e li mandi. Lo stesso principio è spesso applicato nei frameworks asincroni basati su select / poll / epoll ecc...
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  3. #3
    Originariamente inviato da billiejoex
    Potresti creare una variabile "coda", inizialmente vuota, che controlli ad ogni ciclo compiuto dal while. Se la coda è vuota continui come se nulla fosse, altrimenti prendi i dati in essa contenuti e li mandi. Lo stesso principio è spesso applicato nei frameworks asincroni basati su select / poll / epoll ecc...
    bella billie, ho implementato una cosa simile, solo che era ieri alle 1730 l ho provata e funzionnicchia. Al posto di aspettare INFINITE ho imposto un tempo di attesa di 3 secondi. In pratica vado a campionare la porta appunto ogni tre secondi per vedere se qualche carattere e arrivato. In ogni caso grazie per la rispo, aggiungo pero un altra domanda:

    secondo te/voi, sarebbe possibile avere un programma con questa struttura

    // Thread principale

    // Thread Ascolto

    Con il Thread Ascolto sempre in ascolto sulla seriale, ovvero

    WaitForSingleObject(OverlapStruct.hEvent,INFINITE) ==WAIT_OBJECT_0)

    Il mio dubbio e che, impostando infinito, il programma stia sempre nel thread Ascolto. Ci sarebbe un modo per far si che il Thread principale vada a campionare periodicamente il thread Ascolto?

    Mi scuso per la spiegazione contorta, ovviamente resto a disposizione per chiarire il piu possibile!!




  4. #4
    bella billie, ho implementato una cosa simile, solo che era ieri alle 1730 l ho provata e funzionnicchia. Al posto di aspettare INFINITE ho imposto un tempo di attesa di 3 secondi. In pratica vado a campionare la porta appunto ogni tre secondi per vedere se qualche carattere e arrivato.
    Tantissimo. Puoi tranquillamente mettere un timeout di molto inferiore (es: 0.01 secondi) senza che la CPU saturi.

    secondo te/voi, sarebbe possibile avere un programma con questa struttura

    // Thread principale

    // Thread Ascolto

    Con il Thread Ascolto sempre in ascolto sulla seriale, ovvero

    WaitForSingleObject(OverlapStruct.hEvent,INFINITE) ==WAIT_OBJECT_0)

    Il mio dubbio e che, impostando infinito, il programma stia sempre nel thread Ascolto. Ci sarebbe un modo per far si che il Thread principale vada a campionare periodicamente il thread Ascolto?
    Non ho ben capito la tua domanda ma personalmente preferisco sempre l'approccio asincrono ai thread.
    Nel tuo caso, oltretutto, l'utilizzo dei thread non mi sembra neanche giustificato dato che la seriale è una soltanto. Puoi tranquillamente gestire il tutto all'interno del ciclo while dal quale, eventualmente, richiamare le funzioni del caso quando arrivano dati o accadono altri tipi di eventi.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  5. #5
    Originariamente inviato da billiejoex
    Tantissimo. Puoi tranquillamente mettere un timeout di molto inferiore (es: 0.01 secondi) senza che la CPU saturi.



    Personalmente preferisco sempre l'approccio asincrono ai thread.
    Nel tuo caso, oltretutto, l'utilizzo dei thread non mi sembra neanche giustificato dato che la seriale è una soltanto. Puoi tranquillamente gestire il tutto all'interno del ciclo while dal quale, eventualmente, richiamare le funzioni del caso quando arrivano dati o accadono altri tipi di eventi.
    Grazie billie! Allora seguirò il tuo consiglio Magari lunedi ti posto il mio codice via messaggio privato e se hai tempo, ma sopratutto voglia , puoi darci un occhiata perche come ti dicevo ho usato questo approccio ma funzionicchia (traquillo sono poche righe )

    In ogni caso grazie mille per avermi tracciato il percorso!!!

    Buon Week End e grazie ancora!!

  6. #6
    Prego (non che abbia fatto poi molto).

    Saluti
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

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.