这两天做通信实验,发送端使用的循环的getchar()来发送字符。
结果发现,除了想要发送的字符外,最后总还有个换行符。
后来研究发现,是由于getchar()在回车后(输入了需要的字符之后),
linux并不是直接将回车丢掉,而是将它保存在行缓冲中。
这样,下个循环的getchar()就把回车发了出去。
所以,为了在控制台输入数据,而不需要回车,就需要做如下的设置:
#include <termios.h>
static struct termios stored_settings;
void set_keypress(void)
{
struct termios new_settings;
tcgetattr(0,&stored_settings); // 存储旧的模式
new_settings = stored_settings;
/* Disable canonical mode, and set buffer size to 1 byte */
new_settings.c_lflag &= (~ICANON); // 不使用标准模式,即取消行缓冲
new_settings.c_cc[VTIME] = 0;
new_settings.c_cc[VMIN] = 1;
tcsetattr(0,TCSANOW,&new_settings);
return;
}
void reset_keypress(void)
{
tcsetattr(0,TCSANOW,&stored_settings); // 恢复旧模式
return;
}
tcgetattr() 和tcsetattr() 中的0是标准输入fd。
TCSANOW是改变立即发生。
c_lflag是本地模式。
c_cc是控制字符。
termios的详细介绍请参考 Termios