2008-11-01 5 views
2

Je souhaite lire et écrire à partir d'événements série/d'interruptions. Actuellement, je l'ai dans une boucle while et il lit continuellement et écrit à travers la série. Je veux seulement lire quand quelque chose vient du port série. Comment puis-je l'implémenter en C++?Evénements/Interruptions dans la communication série

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); 

    } 

Répondre

0

Utilisez une déclaration select, qui va vérifier la lecture et d'écriture des tampons sans blocage et retourner leur statut, de sorte que vous ne devez lire quand vous savez que le port dispose de données ou écrivez quand vous savez qu'il y a de la place dans le tampon de sortie.

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

Editer: La page de manuel de select a un exemple plus simple et plus complet vers la fin. Vous pouvez le trouver au http://linux.die.net/man/2/select si man 2 select ne fonctionne pas sur votre système.

Remarque: La mastérisation select() vous permet de travailler avec les ports série et les sockets; C'est au cœur de nombreux clients et serveurs réseau.

+0

Puis-je voir un exemple de l'instruction select utilisé ou un lien vers un exemple? Je ne pouvais pas le trouver sur google. – Steve

+0

Je suis tombé sur deux, ajouté ci-dessus. J'ai trouvé la page de manuel plus claire et plus concise. Le lien developerweb est plus axé sur le socket, mais dispose de questions et réponses qui peuvent aider. –

+0

select() ne fonctionne qu'avec les descripteurs de fichier POSIX (entiers), PAS les HANDLE de Windows. –

0

Pour un environnement Windows, l'approche native serait d'utiliser asynchronous I/O. Dans ce mode, vous utilisez toujours les appels à ReadFile et WriteFile, mais au lieu de bloquer, vous passez une fonction de rappel qui sera invoquée lorsque l'opération se termine.

Il est assez difficile d'obtenir tous les détails bien.

+0

Le problème avec les E/S série asynchrones est que le premier octet que vous obtenez va déclencher votre événement de lecture de données, après quoi vous devez d'une manière ou d'une autre comprendre quand vous avez fini d'obtenir de nouvelles données. Je pense que je vais poser une question à ce sujet, car il ne semble pas encore y avoir de bonne réponse. – Coderer

+0

On lit généralement (1) jusqu'à ce que le tampon soit vide, en supposant qu'il y ait * un * tampon, ou (2) rester dans la boucle de lecture jusqu'à ce qu'un délai approprié se produise. "Approprié" est laissé comme un exercice pour le lecteur. :-) –

0

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

0

ici un code qui lisent les données de Incomming série à l'aide d'interruption sur les fenêtres 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); } }

Questions connexes