Прежде всего, я не специалист по этой теме, просто мне интересно, так что примите этот ответ с щепоткой соли.
Я не знаю, было ли когда-нибудь возможным то, что вы пытаетесь сделать здесь (если я не смотрю на это неправильно, кажется, что это обход ядра и чтение непосредственно из порта в пространство пользователя) (вы можете найти несколько примеров, например , этот , но я не смог найти ничего должным образом документированного), но с последними ядрами вы должны получить ошибку при запуске кода, но вы ее не поймаете.
Если вы добавите эти строки после объявления вашего порта:
...
int fd=open("/dev/ttyS0", O_NOCTTY | O_RDONLY | O_SYNC | O_DIRECT );
if (fd == -1) {
fprintf(stderr, "Error %d opening SERIALPORT : %s\n", errno, strerror(errno));
return 1;
}
tcflush(fd,TCIOFLUSH);
....
Когда вы попытаетесь запустить, вы получите: Error 22 opening SERIALPORT : Invalid argument
В моем скромном и ограниченном понимании вы сможете получить тот же эффект, изменив настройки в termios на raw
, что-то вроде этого должно сделать:
struct termios t;
tcgetattr(fd, &t); /* get current port state */
cfmakeraw(&t); /* set port state to raw */
tcsetattr(fd, TCSAFLUSH, &t); /* set updated port state */
Есть много хороших источников для termios, но единственное место, где я могу найти, что также относится к O_DIRECT
(для файлов), это этот .