我正在编写通过 UART (stty) 与 MCU 通信的程序我使用的平台是带有 Debian 的 Acmesystems Acqua A5 (SAMA5D31)。MCU 与 PC 之间的协议如下:MCU 地址、数据、CRC。如果一切正常,MCU 会生成一个相应的答案。问题是 - 当我在 USB 键盘上输入内容或插入闪存驱动器时,通信会冻结。所以,我认为USB奇怪地影响了stty。我发现如果我禁用 IGNBRK,不会冻结,但通信过程中会出现很多错误(这是真的,我不需要任何特殊字符)这是 COM 端口初始化:
struct termios options;
tcgetattr (fd, &options);
cfsetispeed (&options, B115200);
cfsetospeed (&options, B115200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~(PARENB | CSTOPB | CSIZE);
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO | ECHOE | ECHOK | ECHOKE | ECHONL | ECHOCTL | ECHOPRT);
options.c_lflag |= NOFLSH;
options.c_iflag &= ~(INPCK | INLCR | IXON | IXOFF | IXANY | IGNCR | ICRNL | IUCLC);
options.c_iflag |= (IGNBRK | IGNPAR);
options.c_oflag &= ~(OPOST | OFILL);
options.c_cc[VINTR] = 0;
options.c_cc[VQUIT] = 0;
options.c_cc[VERASE] = 0;
options.c_cc[VKILL] = 0;
options.c_cc[VEOF] = 0;
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
options.c_cc[VSWTC] = 0;
options.c_cc[VSTART] = 0;
options.c_cc[VSTOP] = 0;
options.c_cc[VSUSP] = 0;
options.c_cc[VEOL] = 0;
options.c_cc[VREPRINT] = 0;
options.c_cc[VDISCARD] = 0;
options.c_cc[VWERASE] = 0;
options.c_cc[VLNEXT] = 0;
options.c_cc[VEOL2] = 0;
tcsetattr (fd, TCSANOW, &options);
fcntl (fd, F_SETFL, FNDELAY);