2

我正在尝试在 Linux Mint 15 上使用 Arduino 和 C 实现一个简单的 SLAM 项目。Arduino 项目正在通过蓝牙(串行)将数据发送到笔记本电脑。数据由 C 程序读取。在 Arduino 串口中,数据显示正确,但在 notebook 中,接收到的数据是错误的。(在图像中,白色是 Arduino 数据。终端显示“收到”数据。)

我正在发送d080x096y099z035(例如)和接收99z0356y0999z035(乱序?)。

所以,我有一些问题:

  1. 我该怎么做才能read()在 C 中创建命令,以正确的顺序和长度读取数据?(顺序:d000x000y000z000,长度 = 16)

  2. 在 Arduino 发送功能中,使用Serial.print(char buffer[])和是否存在长度差异Serial.println(char buffer[])?(比如'\n'在缓冲区末尾添加 a 或其他内容?)

  3. 我应该delay()在 Arduino 代码还是 C 代码中使用该函数?

在阿杜诺:

...
int buffer_size = 17;
char  buffer[17];

//void setup()

void loop(){
  //create the string resp = "d000x111y222z333"
  ...
  resp.toCharArray(buffer, buffersize);
  bluetooth.print(buffer);
  delay(200);
}

在 C 程序中:

...
int fd = open("/dev/rfcomm4", O_RDONLY | O_NOCTTY | O_NDELAY);
printf("fd code %d\n", fd);
if (fd == -1)
{
  gchar *msg = "open_port: Unable to open /dev/rfcomm4";
  gtk_label_set_text(GTK_LABEL(label), msg);
  perror("error: ");
}

char buffer[17];
int n;

printf("entering in loop...\n");

while (1)
{
  n = read(fd, buffer, sizeof(buffer));
  printf("%s\n", buffer);
}
4

1 回答 1

0

抱歉,我不是专家,但您可能会针对您的问题提出一些想法:

到 1) 我猜这可能是编码的问题,因为 Python AFAIK 期望文件是 unicode。所以尝试open (.... ,encoding='ascii')或使用任何编码

另请注意,您可能会阻塞 GTK 主线程,这会导致您的 UI 出现严重延迟。因此,如果您发送更新请求,我建议创建一个自己的线程来读取串行端口并填充内部缓冲区,该线程由 GTK 主线程呈现:http: //www.pardon-sleeuwaegen.be/antoon/python/page0 .html

于 2013-10-31T11:07:33.370 回答