2

我试图弄清楚如何通过 USB 端口从我的 Arduino Mega 2560 获取信息到在 Xubuntu 中运行的 C 程序。

我正在尝试将最简单的示例放在一起作为起点。

Arduino IDE 附带了一些不错的基本示例,其中之一是Graph,它只是打印来自电位计或其他模拟传感器的值:

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(A0));
  delay(2);
}

那里没有问题,但是至于将在我的计算机上运行并接收数据的程序,这是我到目前为止所拥有的(在阅读本文并进行更多挖掘后更新):

/* prints the output from an Arduino running the "Graph" example.
 */

#include <stdio.h>
#include <sys/fcntl.h>
#include <termios.h>

int main(void)
{
  int fd = 0;
  char buffer[32];
  int n;
  fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
  while(1)
  {
    read(fd, buffer, sizeof(buffer));
    n = atoi(buffer);
    printf("%d\n", n);
  }
  close(fd);
}

几乎可以正常工作,但它似乎丢失的消息比收到的消息多,而且很多消息都不完整。

在此过程中可以设置几个选项和标志,但我无法确定要设置哪些选项和标志。

最终,我计划使用通过我的 Arduino 运行的各种传感器来控制在我的计算机上运行的基于 SDL 的应用程序,但只要我能得到那个字符串,我就应该回到熟悉的领域。

4

2 回答 2

0

您的缓冲区可以(并且很可能)包含多条消息。它还可能包含不完整的消息(read()调用可能会在读取您要求的所有数据之前返回)。

例如,如果您收到的数据是文本形式的 -'\n'分隔(或'\0',或space,或其他)数字流,则您的缓冲区最终可能看起来像0123\n4567\n89ab. 然后,当您调用 时atoi(),它会转换0123为 123 并跳到循环的下一次迭代,同时放弃缓冲区中剩余的所有数据。

于 2012-12-25T03:37:40.860 回答
0

就是我一直在寻找的。

于 2012-12-27T13:15:11.347 回答