Question

Je veux lire et écrire à partir d'une série à l'aide d'événements / interruptions. Actuellement, je l'ai dans une boucle while et il lit et écrit en continu dans le feuilleton. Je veux qu'il ne lise que lorsque quelque chose provient du port série. Comment puis-je implémenter cela en C ++?

Ceci est mon code actuel:

    while(true)
    {
        //read
        if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //error occurred. Report to user.
        }

        //write
        if(!WriteFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //error occurred. Report to user.
        }


        //print what you are reading
        printf("%s\n", szBuff);

    }
Était-ce utile?

La solution

Utilisez une instruction select , qui vérifie les tampons de lecture et d'écriture sans les bloquer et renvoie leur statut. Vous n'avez donc besoin de lire que lorsque le port contient des données, ou d'écrire lorsque vous savez qu'il existe espace dans le tampon de sortie.

Le troisième exemple sur http://www.developerweb.net/forum /showthread.php?t=2933 et les commentaires associés peuvent être utiles.

Modifier: La page de manuel de select contient un exemple plus simple et plus complet vers la fin. Vous pouvez le trouver à l'adresse http://linux.die.net/man/2/select si man 2, sélectionnez ne fonctionne pas sur votre système.

Remarque: La maîtrise de select () vous permettra de travailler avec les ports série et les sockets; il est au cœur de nombreux clients et serveurs réseau.

Autres conseils

Pour un environnement Windows, une approche plus native consiste à utiliser E / S asynchrones . Dans ce mode, vous utilisez toujours les appels à ReadFile et WriteFile, mais au lieu de bloquer, vous transmettez une fonction de rappel qui sera appelée à la fin de l'opération.

Cependant, il est assez délicat d’obtenir tous les détails.

Voici une copie d'un article publié dans le c / C ++. journal des utilisateurs il y a quelques années. Il entre dans les détails sur l'API Win32.

ici un code qui lit les données série entrantes en utilisant une interruption sur Windows vous pouvez voir le temps écoulé pendant le temps d'interruption d'attente

int pollComport(int comport_number, LPBYTE buffer, int size) { BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; int n; double TimeA,TimeB; // Specify a set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR ); while (m_comPortHandle[comport_number] != INVALID_HANDLE_VALUE) { // Wait for an event to occur for the port. TimeA = clock(); WaitCommEvent (m_comPortHandle[comport_number], &dwCommModemStatus, 0); TimeB = clock(); if(TimeB-TimeA>0) cout <<" ok "<<TimeB-TimeA<<endl; // Re-specify the set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR); if (dwCommModemStatus & EV_RXCHAR) { // Loop for waiting for the data. do { ReadFile(m_comPortHandle[comport_number], buffer, size, (LPDWORD)((void *)&n), NULL); // Display the data read. if (n>0) cout << buffer <<endl; } while (n > 0); } return(0); } }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top