int serialDevice = open ("/ dev / ttyUSB0", O_RDWR | O_NOCTTY);
В дополнение к ответу @ darune и O_NONBLOCK
, вы также можете рассмотреть O_SYNC
,См. Также Как открывать, читать и записывать с последовательного порта в C?
Вы также можете рассмотреть вопрос об исключении дескриптора файла, чтобы другая программа, такая как Modem Manager, не открывала устройство и гадость с твоим состоянием .Исключительно хорошо из-за O_RDWR
.См. Также Как сделать / dev / ttyACM0 (и друзей) эксклюзивным? в списке рассылки Kernel Newbies.
Чтобы сделать дескриптор файла эксклюзивным, вам нужно использовать ioctl
и TIOCEXCL
.O_EXCL
не работает должным образом, потому что это не учитывается для символьных устройств (а люди ядра говорят -ENOPATCH
).
int term_config(int fd, int speed)
{
struct termios tty;
memset(&tty, 0, sizeof(tty));
if (tcgetattr(fd, &tty) != 0) {
log_error("term_config: tcgetattr: %s\n", strerror(errno));
return -1;
}
cfmakeraw(&tty);
tty.c_cflag |= CLOCAL; /* ignore status lines */
tty.c_cflag |= CRTSCTS; /* hardware flow control */
cfsetospeed(&tty,(speed_t)speed);
cfsetispeed(&tty,(speed_t)speed);
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
log_error("term_config: tcsetattr: %s\n", strerror(errno));
return -1;
}
if (ioctl(fd, TIOCEXCL, NULL) != 0) {
log_error("term_config: ioctl_tty: %s\n", strerror(errno));
return -1;
}
return 0;
}
Вы бы назвали term_config
что-то вроде:
int serialDevice = open("/dev/ttyUSB0", ...);
if (serialDevice == -1) { /* error */ }
int result = term_config(serialDevice, B115200);
if (result != 0) { /* error */ }