串行通信缓冲区数据乱序

时间:2013-10-25 02:46:05

标签: c gtk arduino

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

我发送d080x096y099z035(例如)并收到99z0356y0999z035(乱序?)。

所以,我有一些问题:

  1. 如何在C中制作read()命令,以正确的顺序和长度读取数据? (订单:d000x000y000z000,长度= 16)

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

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

  4. 在Arduino:

    ...
    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);
    }
    

1 个答案:

答案 0 :(得分:0)

对不起,我不是专家,只是一些想法,你可以检查一下你的问题:

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

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