Повреждение данных в функции termios в Linux при чтении непрерывных данных 0xFF

Я пишу одну программу для последовательного порта ttyS4, которая использует функцию termios. Эта программа использует неканонический режим. Я могу отправлять шестнадцатеричные данные, а также читать шестнадцатеричные данные. Моя проблема заключается в том, что когда я читаю данные, имеющие несколько байтов 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);

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

Пожалуйста, кто-нибудь может подсказать, как решить эту проблему.

0 ответов

Другие вопросы по тегам