События / прерывания в последовательной связи - PullRequest
2 голосов
/ 01 ноября 2008

Я хочу читать и писать из последовательного интерфейса, используя события / прерывания. В настоящее время у меня есть в то время как цикл, и он постоянно читает и пишет через последовательный Я хочу, чтобы он только читал, когда что-то поступает из последовательного порта. Как мне реализовать это в C ++?

Это мой текущий код:

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

    }

Ответы [ 4 ]

0 голосов
/ 31 января 2013

здесь код, который считывает данные последовательного ввода, используя прерывание на окнах Вы можете видеть время, прошедшее в течение времени ожидания ожидания

</p>

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

0 голосов
/ 01 ноября 2008

Для среды Windows более естественным подходом будет использование асинхронного ввода-вывода . В этом режиме вы по-прежнему используете вызовы ReadFile и WriteFile, но вместо блокировки вы передаете функцию обратного вызова, которая будет вызываться после завершения операции.

Довольно сложно все детали правильно понять.

0 голосов
/ 01 ноября 2008

Вот копия статьи , которая была опубликована в журнале пользователей c / C ++ несколько лет назад. Это подробно описано в Win32 API.

0 голосов
/ 01 ноября 2008

Используйте оператор select, который будет проверять буферы чтения и записи без блокировки и возвращать их состояние, поэтому вам нужно только читать, когда вы знаете, что порт имеет данные, или писать, когда вы знаете, что в выходном буфере есть место .

Третий пример на http://www.developerweb.net/forum/showthread.php?t=2933 и связанные комментарии могут быть полезны.

Редактировать: Справочная страница для выбора имеет более простой и более полный пример ближе к концу. Вы можете найти его в http://linux.die.net/man/2/select, если man 2 select не работает в вашей системе.

Примечание: Мастеринг select() позволит вам работать как с последовательными портами, так и с сокетами; это сердце многих сетевых клиентов и серверов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...