Linuxシリアルポートプログラミング——入力キャッシュをクリアする


背景


私たちの仕事では、シリアルポートは比較的よく使われるデータ伝送方式です.一部のアプリケーションシーンでは、プログラムが起動してシリアルポートを開いた後、シリアルポートが開く前の入力キャッシュデータ(すなわち、カーネルドライバが受信したがアプリケーション層によって読み出されていないデータ)を読み出すことを望んでいないため、入力キャッシュデータをクリア(消去、破棄)する必要がある.次に、Linuxシステム上のシリアルポートプログラミングを例に説明します.

テスト環境


ハードウェア環境:PCオペレーティングシステム:Ubuntu 14.04仮想マシン

テストコード

  • 方法1
  • fd = open("devpath", O_RDWR|O_NOCTTY);
    usleep(200000);
    tcflush(fd, TCIFLUSH);    //      
    tcflush(fd, TCOFLUSH);    //      
    tcflush(fd, TCIOFLUSH);   //        
    tcsetattr(m_ifd, TCSANOW, &strctNewTermios);
  • 方法二
  • fd = open("devpath", O_RDWR|O_NOCTTY);
    usleep(200000);
    ioctl(fd, TCFLSH, 0);    //      
    ioctl(fd, TCFLSH, 1);    //      
    ioctl(fd, TCFLSH, 2);    //        
    tcsetattr(fd, TCSANOW, &strctNewTermios);

    まとめ

  • はopenとtcflush(またはioctl)操作の間で遅延操作を行う必要があります(特定の時間は検証されていません).そうしないと、linuxカーネルバージョンに関連する
  • の原因は不明です.
  • は、入力のみを空にするか出力のみを空にするか、または両方を空にするかを自由に選択することができる
  • .
  • tcflushとioctlの2つの方法はいずれも有効であり、ioctlの2番目のパラメータはTCFLSH
  • であることに注意する.