Насколько я вижу, одним из лучших источников для выяснения того, как читать и писать в узел /dev/serial/by-id/*arduino*
dev, является эта ссылка:
http://todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/
Однако его serialport_read_until
пахнет подозрительно. Разве serialport_read_until(fd, buf, '\n')
не совпадает с fgets(buf, bufsize, fptr)
? Другими словами, что мешает мне использовать fdopen
в дескрипторе файла для получения FILE *fptr
, а затем использовать fgets
/ fscanf
/ fgetc
?
Я пробовал этот подход. Пишущие вызовы, такие как fputc
, работают, но вызовы чтения перестают работать с errno = 0
.
Код инициализации:
devfd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY);
int devfl = fcntl(devfd, F_GETFL);
// Serial/terminal options
termios termopts;
if (tcgetattr(devfd, &termopts))
throw;
// No parity; No flow control; One stop bit
// Select 8 data bits
// local ownership; read enabled
termopts.c_cflag = CS8 | CLOCAL | CREAD;
// No canonical features; raw mode; no echo
termopts.c_lflag = 0;
// No input processing features; raw mode
termopts.c_iflag = 0;
// No output processing features; raw mode
termopts.c_oflag = 0;
if (cfsetispeed(&termopts, B115200)) // 115200 baud in
throw;
if (cfsetospeed(&termopts, B115200)) // 115200 baud out
throw;
// Read timeout
termopts.c_cc[VTIME] = 10; // Time out after 1s
termopts.c_cc[VMIN] = 0; // Wait for each character
if (tcsetattr(devfd, TCSANOW, &termopts))
throw;
devf = fdopen(devfd, "r+");
if (!devf)
throw;
Функции записи и чтения:
void dputc(char comm)
{
if (fputc(comm, devf) == EOF)
throw;
if (fflush(devf))
throw;
}
void dputs(const char *str)
{
if (fputs(str, devf) < 0)
throw;
if (fflush(devf))
throw;
}
void dprintf(const char *str...)
{
va_list ap;
va_start(ap, str);
int n = vfprintf(devf, str, ap);
va_end(ap);
if (n < 1)
throw;
if (fflush(devf))
throw;
}
Код чтения:
unsigned short f;
if (fscanf(devf, "%hu", &f) < 1)
throw;
Есть идеи, почему такое чтение не удастся?
Спасибо.