Серийный порт не читается - PullRequest
0 голосов
/ 02 апреля 2012

У меня странная проблема с чтением через последовательный порт в Linux.Приблизительно в 50% случаев я не получу никаких данных от последовательного порта, когда я читаю с него, но если я использую GTKTerm, я получаю данные обратно 100% времени.Я дважды проверил свои настройки, и настройки терминала, которые я использую, точно такие же, что и GTKTerm, поэтому я не уверен, почему это произойдет.Единственное, о чем я мог подумать, это то, что порт установлен в каноническом режиме, а не в необработанном режиме, но я установил его правильно - устройство, с которого я читаю, не отправляет переводы строки со всеми командами.Тем не менее, все работает правильно, когда устройство отправляет назад команды с символом новой строки.

Вот код, который я использую:

int fd = open(serial_port, O_RDWR );
if( fd < 0 ){
    perror("open");
}

//Set the serial port settings
struct termios newio;
if( tcgetattr( fd, &newio ) < 0 )
    perror("tcgetattr");

if( cfsetospeed( &newio, B9600 ) < 0 )
    perror("cfsetospeed");

newio.c_cflag &= ~CSTOPB;
newio.c_cflag &= ~CSIZE;
newio.c_cflag |= CS8;

newio.c_cflag |= CREAD;
newio.c_iflag |= IGNPAR;
newio.c_iflag |= IGNBRK;
newio.c_iflag &= ~BRKINT;
newio.c_iflag &= ~ICRNL;
newio.c_iflag &= ~IXON;
newio.c_cflag |= CLOCAL;
newio.c_oflag = 0;
newio.c_lflag = 0;
newio.c_cc[VTIME] = 0;
newio.c_cc[VMIN] = 1;
if( tcsetattr( fd, TCSANOW, &newio ) < 0 )
    perror("tcsetattr");
tcflush( fd, TCOFLUSH );
tcflush( fd, TCIFLUSH );

Чтение кода (в отдельном потоке)

void* thr(void* ign){
    char buffer[10];
    while( 1 ){
            int got = read(fd, buffer, 10);
            buffer[got] = 0;
            printf("got %s\n", buffer);
    }
}

1 Ответ

2 голосов
/ 03 апреля 2012

Ну, я обнаружил проблему.

По какой-то странной причине устройство, на которое я отправляю сообщение, похоже, не имеет большого буфера или чего-то подобного; оказывается, что когда я отправляю команды в виде строки одновременно, я не всегда получаю ответ обратно. Сон между посылкой символов решает проблему (хотя я признаю, что это не очень хорошее решение). Вероятно, происходило то, что меня прерывали в точках, что давало устройству достаточно времени для обработки некоторых его входных данных. GTKTerm будет отправлять каждый символ по мере его поступления, и невозможно набрать достаточно быстро, чтобы произошла эта ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...