0

termios 関数を使用するシリアルポート ttyS4 用のプログラムを 1 つ作成します。そのプログラムは非標準モードを使用しています。16 進データを送信でき、16 進データを読み取ることもできます。私の問題は、複数の 0xFF バイトを受信したデータを読み取っているときに、シリアル ポート バッファが追加の 0xFF バイトをガベージ形式で満たしたときです。私の送信データの例は

01 23 73 00 03 7b 29 00 03 86 9c 00 03 61 73 00 00 03 5b 00 00 03 63 00 00 02 d6 00 00 00 00 00 00 c3 70 00 00 03 e8 00 00 03 e8 00 00 03 e8 00 00 03 e8 00 00 02 2c ff ff ff fc 00 00 02 2c 00 00 72 89 00 00 00 00 00 00 00 93 00 00 72 9d 0b 35 33 0d 06 11 00 05 00 08 00 00 2a d9 00 00 28 22 00 16 00 01 00 05 00 ab 82 40 00 ab a9 50 01 01 01 00 00 00 1f 9b 71

実際に受け取ったデータは次のとおりです。

01 23 73 00 03 7b 29 00 03 86 9c 00 03 61 73 00 00 03 5b 00 00 03 63 00 00 02 d6 00 00 00 00 00 00 c3 70 00 00 03 e8 00 00 03 e8 00 00 03 e8 00 00 03 e8 00 00 02 2c ff ff ff ff ff ff fc 00 00 02 2c 00 00 72 89 00 00 00 00 00 00 00 93 00 00 72 9d 0b 35 33 0d 06 11 00 05 00 08 00 00 2a d9 00 00 28 22 00 16 00 01 00 05 00 ab 82 40 00 ab a9 50 01 01 01 00 00 00 1f 9b 71

追加で 3 個の 0xFF (ガベージ) を受け取りました。この問題は、複数バイト0xFFを受信したときに発生します。

ポートを設定するには、次の設定を行います。

///////////////////////////////////////////////////////
fd = open("/dev/ttyS4",O_RDWR | O_NOCTTY| O_SYNC);

struct termios SerialPortSettings;

cfsetispeed(&SerialPortSettings,B9600);  // 9600 baud rate

SerialPortSettings.c_cflag &= ~PARENB;   // No Parity}

SerialPortSettings.c_cflag &= ~CSTOPB; //Stop bits = 1 

SerialPortSettings.c_cflag &= ~CSIZE; /* Clears the Mask*/

SerialPortSettings.c_cflag |=  CS8;   /* Set the data bits = 8 */

SerialPortSettings.c_cflag &= ~CRTSCTS; //Turn off hardware based flow control

SerialPortSettings.c_cflag |= CREAD | CLOCAL;//Turn on the receiver of the serial port (CREAD)

SerialPortSettings.c_iflag &= ~IGNBRK;

SerialPortSettings.c_iflag |=  BRKINT;

SerialPortSettings.c_iflag &= ~ISTRIP;

SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY); //Turn off software based flow control (XON/XOFF).

SerialPortSettings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG );//Setting the mode of operation,the default mode of operation of serial port in Linux is the Non - Cannonical mode

SerialPortSettings.c_iflag &= ~(INLCR | ICRNL );

SerialPortSettings.c_cc[VMIN]  = 0;

SerialPortSettings.c_cc[VTIME] = 100;

tcflush(fd, TCIOFLUSH);

tcsetattr(fd,TCSANOW,&SerialPortSettings);

///////////////////////////////////////////////////////////////

この問題を解決する方法を提案してください。

4

0 に答える 0