У меня странная проблема с чтением через последовательный порт в 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);
}
}