2

イベント/割り込みを使用してシリアルから読み書きしたい。現在、私はそれをwhileループに入れており、シリアルを介して継続的に読み書きしています。何かがシリアルポートから来るときだけ読むようにしたい。これを C++ で実装するにはどうすればよいですか?

これは私の現在のコードです:

    while(真)
    {
        //読んだ
        if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //エラーが発生しました。ユーザーに報告します。
        }

        //書きます
        if(!WriteFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //エラーが発生しました。ユーザーに報告します。
        }


        //読んでいるものを印刷する
        printf("%s\n", szBuff);

    }
4

4 に答える 4

0

これは、数年前にc /C++ユーザージャーナルに公開された記事のコピーです。Win32APIについて詳しく説明します。

于 2008-11-01T02:57:05.733 に答える
0

Windows 環境の場合、よりネイティブなアプローチは非同期 I/Oを使用することです。このモードでも ReadFile と WriteFile の呼び出しを使用しますが、ブロックする代わりに、操作の完了時に呼び出されるコールバック関数を渡します。

ただし、すべての詳細を正しく取得するのはかなり難しいです。

于 2008-11-01T01:31:51.553 に答える
0

ブロックせずに読み取りバッファーと書き込みバッファーをチェックし、それらのステータスを返すステートメントを使用しselectて、ポートにデータがあることがわかっている場合にのみ読み取り、または出力バッファーに空きがあることがわかっている場合にのみ書き込む必要があります。

http://www.developerweb.net/forum/showthread.php?t=2933の 3 番目の例と関連するコメントが役立つ場合があります。

編集: select の man ページには、最後の近くに、より単純で完全な例があります。システムで動作しない場合は、 http://linux.die.net/man/2/selectで見つけることができます。man 2 select

注:マスタリングselect()を行うと、シリアル ポートとソケットの両方で作業できるようになります。これは、多くのネットワーク クライアントとサーバーの心臓部です。

于 2008-11-01T00:51:20.027 に答える
0

ここでは、Windows で割り込みを使用してシリアル着信データを読み取るコードを示します。待機中の割り込み時間中に経過した時間を確認できます。

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

于 2013-01-31T10:54:32.443 に答える