Pregunta

Quiero leer y escribir desde una serie usando eventos / interrupciones. Actualmente, lo tengo en un bucle while y lee y escribe continuamente a través de la serie. Quiero que solo lea cuando algo viene del puerto serie. ¿Cómo implemento esto en C ++?

Este es mi código actual:

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

    }
¿Fue útil?

Solución

Use una declaración select , que verificará los búferes de lectura y escritura sin bloquear y devolverá su estado, por lo que solo necesita leer cuando sepa que el puerto tiene datos, o escribir cuando sepa que hay Sala en el buffer de salida.

El tercer ejemplo en http://www.developerweb.net/forum /showthread.php?t=2933 y los comentarios asociados pueden ser útiles.

Editar: La página del manual para seleccionar tiene un ejemplo más simple y completo cerca del final. Puede encontrarlo en http://linux.die.net/man/2/select si man 2 select no funciona en su sistema.

Nota: El dominio de select () le permitirá trabajar con puertos serie y sockets; está en el corazón de muchos clientes y servidores de red.

Otros consejos

Para un entorno Windows, el enfoque más nativo sería usar E / S asíncrona . En este modo, todavía utilizas las llamadas a ReadFile y WriteFile, pero en lugar de bloquearte, pasa una función de devolución de llamada que se invocará cuando finalice la operación.

Sin embargo, es bastante difícil conseguir todos los detalles correctamente.

Aquí hay una copia de un artículo que se publicó en C / C ++ Diario de usuarios hace unos años. Entra en detalles sobre la API de Win32.

aquí un código que lee los datos entrantes en serie utilizando la interrupción en Windows puede ver el tiempo transcurrido durante el tiempo de interrupción de espera

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top