Tag: termios

如何更改termios配置,以便当用户按键时getc()立即返回?

我想为CLI应用程序实现自动完成function。 只有在输入以下字符列表时,才会返回getc()的默认行为:NEW_LINE或EOF。 我想将TAB添加到此列表中,以便我可以触发自动完成算法。 有没有办法做到这一点,例如,使用termios? editline库(http://www.thrysoee.dk/editline/)可以做到,但我无法想象它是怎么做的?

读取将stdout从unbuffered更改为以规范模式缓冲的行

当我在规范模式下使用这段代码时: #include #include #include static struct termios newt; static struct termios oldt; static void kb_fini(void) { tcsetattr(STDIN_FILENO, TCSANOW, &oldt); } void kb_init(void) { tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= (tcflag_t)~(ICANON | ECHO | ISIG); newt.c_cc[VMIN] = 1; newt.c_cc[VTIME] = 0; tcsetattr(STDIN_FILENO, TCSANOW, &newt); atexit(kb_fini); } int main(void) { int c; kb_init(); printf(“Press q “); […]

如何区分Escape和Escape Sequence

我的最终目标是区分我在键盘上按下Esc (ASCII 27 ),然后按下我键盘上的→键(转换为27 91 67的序列)。 我正在使用termios将我的终端设置为非Canonical模式。 我想我明白有两种选择: 等待一段任意的时间来看看是否有东西进入(似乎是hacky) 检查STDIN以查看它是否为空 我正在尝试做后者。 为此,我试图使用select来查看stdin是否为空。 问题 select似乎总是返回0(超时到期)。 这似乎很奇怪,原因有两个: 我想如果我在击中Esc之后没有输入任何内容,那么它将返回-1,因为它没有看到stdin中有任何东西要读 我想如果我输入→ ,那么我会得到一个1因为它看到27之后就有91和67来读 这些事情都没有发生,所以我害怕我只是不理解select或标准输入/输出就像我想的那样。 问题 为什么在我的例子中没有select返回0以外的任何东西? 是否可以检查stdin是否为空? 其他库如何处理这个? 最小,完整和可validation的示例 我在MacOS High Sierra和Ubuntu 16上运行它,结果相同。 资源: #include #include #include #include #include #include #include #include int main() { // put terminal into non-canonical mode struct termios old; struct termios new; int fd = […]

Ubuntu串行通信:读取失败然后立即进入

我正在编写一个在运行Ubuntu服务器14.04的MIO-3260单板计算机上运行的程序,并与AMC DPRANIE C100A400驱动器通信。 程序向驱动器发送一串hex代码,并且应该为它发送的每条消息接收响应。 当我在Windows上的realTerm中尝试它时效果很好所以我不认为这是驱动器的问题。 但是,当我尝试从串口读取时,read()几乎一直都会返回-1,直到突然在一个看似随机的点上,我立刻得到了大量的消息。 我正在使用termios来设置串口。 这是我的代码。 我已经尝试在阻塞配置中进行设置,但如果我这样做,代码只会在第一次读取()时无限期挂起。 int fd; fd = open(“/dev/ttyS0”,O_RDWR | O_NOCTTY | O_NDELAY); struct termios SerialPortSettings; tcgetattr(fd, &SerialPortSettings); //get current settings of serial port cfsetispeed(&SerialPortSettings,B115200);//set input baud rate cfsetospeed(&SerialPortSettings,B115200);//set output baud rate SerialPortSettings.c_cflag &= ~PARENB;//clear parity bit (no parity) SerialPortSettings.c_cflag &= ~CSTOPB;//Stop bits = 1 SerialPortSettings.c_cflag &= ~CSIZE;//clears the mask […]