gpt4 book ai didi

c - 使用 FILE* 从 Arduino tty 中读取

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:38 26 4
gpt4 key购买 nike

据我所知,了解如何读取和写入 /dev/serial/by-id/*arduino* 开发节点的最佳资源之一是此链接:

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;

知道为什么这样阅读会失败吗?

谢谢。

最佳答案

我解决了这个问题。有很多问题:

  • 在 OpenSuse 11.2 上,/var/lock 的组是错误的。当它应该是 lock 时,它被设置为 root
  • 我既不属于lock 也不属于dialout 组。
  • 每次 /dev/ttyACM* 后面的驱动程序看到新文件句柄时,Arduino 都会自动重启。这个 Arduino Uno 在 handle 打开后需要相当长的时间才能访问( > 1s )。这是通过从 Arduino 发送启动消息并在文件句柄打开后在 Linux 客户端中等待它来解决的。
  • FILE* 函数起作用。但是,它不喜欢在同一个句柄上读写;它搞砸了寻求。我必须有两个单独的描述符和两个单独的 FILE*
  • 我不得不禁用 O_NONBLOCK

警告 Arduino 驱动程序员!

关于c - 使用 FILE* 从 Arduino tty 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7276797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com