2

/dev/ttyS0 を使用して外部ハードウェアと通信するためのシリアル インターフェイスを実装しています。データ ストリームはパケット形式であり、メッセージの開始、長さバイト、およびバイナリ データでカプセル化されているため、RAW 入力および出力用に構成しました。着信データ ストリーム内の DC1 または DC3 文字、0x11 または 0x13 は、Linux OS (最新の Ubuntu) によって食べられます。

Windows PC と Realterm で通信を監視していますが、モニターに 0x11 と 0x13 の文字が表示されます。私が知る限り、他に欠落しているキャラクターはいません。

これが私のシリアル セットアップ コードです (注 IXON、IXOFF、IXANY は無効になっています)。

void Ser_Open_Port( unsigned char *port )
{
   tcgetattr(ser_handle, &ser_old_settings);
   tcgetattr(ser_handle, &ser_new_settings);

   // Set Baud Rate
   cfsetospeed(&ser_new_settings, baud); 

   // ~BRKINT - No Flush on Break
   // ~PARMRK, ~IGNPAR - Parity Error result in \0 char
   // ~ISTRIP - No 8th bit Strip
   // ~INLCR - No NL to CR Translate
   // ~IGNCR No Ignore CR
   // ~ICRNL No CR to NL Translate
   // ~IXON - No Software Flow Control on Output
   // ~IXOFF - No Software Flow Control on Output
   // ~IXANY - No Software Flow Control on Output
   // ~INPCK - Ignore Parity Checking
   ser_new_settings.c_iflag &= ~(BRKINT|PARMRK|IGNPAR|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF|IXANY|INPCK);
   // IGNBRK - Ignore Break
   ser_new_settings.c_iflag |= (IGNBRK); 

   // ~OPOST - Implementation Defined Output Processing Off - Raw Output
   // All Other c_oflag bits are ignored
   ser_new_settings.c_oflag &= ~(OPOST);

   // ~ICANON - Not Canonical Input Mode
   // ~ECHO - No Echo
   // ~ECHOE - No Echo Erase
   // ~ECHONL - No Echo NL
   // ~ISIG - No Signals
   // ~IEXTEN - Implementation Defined Input Processing Off - Raw Input
   ser_new_settings.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL|ISIG|IEXTEN);

   // ~PARENB - No Parity
   // ~CSTOPB - 1 stop bit 
   // ~CSIZE - Clear Character Size Bits
   ser_new_settings.c_cflag &= ~(PARENB|CSTOPB|CSIZE);
   // CS8 - Character Size 8 bits
   // CLOCAL -  Ignore Modem Control Lines
   ser_new_settings.c_cflag |= (CS8|CLOCAL); 

   // apply the settings
   tcsetattr(ser_handle, TCSANOW, &ser_new_settings);
   tcflush(ser_handle, TCOFLUSH);

   // Open Serial Port for Read/Write, and Non Blocking
   ser_handle = open(port, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
}

シリアルポートバッファから読み取った場所は次のとおりです。

   ser_charin_count = read( ser_handle, ser_charin, 30);
   if( ser_charin_count > 0 && ser_charin_count != 0xFFFFFFFF)
   {
   // Code to Process Message Bytes Here
   }

ご協力いただきありがとうございます。

4

1 に答える 1

2

エラーは、正しいポート属性構造に初期化された ser_handle を取得するために最初にポートを開かなかったことにありました。サブルーチンの先頭に open を配置し、tcgetattr および tcsetattr 関数を使用してポート値を正しく変更しました。

于 2012-12-31T20:11:20.460 に答える