[...]
> tcgetattr(fileno(stdin), &oldsettings); Ты взял атрибуты из STDIN. Терминальный эмулятор делал какие-то stty, которые ты сам не делаешь.
Посмотри, чего не хватает, заполни сам свой newsettings, без подглядывания в stdin на лету.
Вообще, код получился очень хрупкий, так с COM-портом не работают.
read может вернуть вообще 1 байт. Ну, очень шустрый у тебя процессор и успел уловить с помощью select что что-то пришло, потом read это "что-то" поймал, потом ещё что-то будет, но об этом никто не узнает.
Посмотри лучше пример с ~ICANON и без select: https://stackoverflow.com/questions/2917881/how-to-implement...