Я новичок в программировании Linux. Я следовал примеру в Интернете для чтения/записи в консоль, например, «/ dev/ttyS0». Каждый раз, когда я запускаю код, он выходит, не запрашивая пользователя для ввода ввода. Он также искажает терминальную строку (перевод строки) и я не могу видеть, что я печатаю ... Вот код, я использую:запрос терминала искажен и не читается
int main(int argc, char** argv)
{
struct termios tio;
struct termios stdio;
int tty_fd;
/* fd_set rdset; */
printf("Please start with %s /dev/ttyS0 (for example)\n",argv[0]);
unsigned char mesg='D';
memset(&stdio,0,sizeof(stdio));
stdio.c_iflag=0;
stdio.c_oflag=0;
stdio.c_cflag=0;
stdio.c_lflag=0;
stdio.c_cc[VMIN]=1;
stdio.c_cc[VTIME]=0;
tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); // make the reads non-blocking
memset(&tio,0,sizeof(tio));
tio.c_iflag=0;
tio.c_oflag=0;
tio.c_cflag=CS8|CREAD|CLOCAL; // 8n1, see termios.h for more information
tio.c_lflag=0;
tio.c_cc[VMIN]=1;
tio.c_cc[VTIME]=5;
tty_fd=open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY);
cfsetospeed(&tio,B115200); // 115200 baud
cfsetispeed(&tio,B115200); // 115200 baud
tcsetattr(tty_fd,TCSANOW,&tio);
while (mesg != 'q') {
if (read(tty_fd,&mesg,1)>0) write(STDOUT_FILENO,&mesg,1); // if new data is available on the serial port, print it out
if (read(STDIN_FILENO,&mesg,1)>0) write(tty_fd,&mesg,1); // if new data is available on the console, send it to the serial port
}
close(tty_fd);
return(0);
}
* «Я следовал примеру в Интернете ...» * - Тогда вы можете использовать плохой пример. Вызов 'memset (, 0,)', а затем присвоение 0 элементам структуры является избыточным и может вызвать проблемы. Правильная практика для POSIX - это вызов 'tcgetattr()', а затем изменение отдельных атрибутов. См. [Руководство по серийному программированию для операционных систем POSIX] (http://www.cmrr.umn.edu/~strupp/serial.html). Обнуление атрибутов для 'stdout', безусловно, неверно и вызовет проблемы – sawdust