2013-02-21 18 views
0

我正在实现一个通过蓝牙接收数据并将其返回到数组中的函数unsigned char buf[10]。这是我的功能,它通过QTimer称为每x毫秒:释放数据之前使阵列完整

void gui::listen_device() 
{ 
    unsigned char crcval; 

    int count = 0; 

    fd_set readmask; 
    struct timeval tv; 

    int v = 0, v1 = 0, v2 = 0; 

    tv.tv_sec = 0; 
    tv.tv_usec = 100000; 

    int i; 
    memset (buf, 0, 10); 
    FD_ZERO (&readmask); 
    FD_SET (sock, &readmask); 
    if (select (255, &readmask, NULL, NULL, &tv) > 0) 
    { 
     if (FD_ISSET (sock, &readmask)) 
     { 
      numb = read (sock, buf, 10); 

       // print of counter 
       printf ("%d ->", buf[0]); 
       fprintf (data, "%d,", buf[0]); 
       for (i = begin; i < numb-1; i++) 
       { 
        v = buf[i]; 
        printf ("%d,", v); 
        fprintf (data, "%d,", v); 
       } 

       //---------------// 
       crcval = BP_CRC8(buf,9); 
       printf(" crcf=%x crcc=%x", buf[9], crcval); 
       if (crcval == buf[9]) 
       { 
        printf("crc ok\n"); 
        begin = 1; 
       } 
       else 
       { 
        printf("crc fail\n"); 
        begin = numb -1; 
       } 
       //---------------// 

       printf ("\n"); 
       fprintf (data, "\n"); 
     } 
    } 
} 

我希望函数返回buf只有当它是满的。所以我创建了一个全局变量begin如果buf在最后一次计时器到来时未满。

这是.txt文件中的输出。

0,0,0,0,0,0,0,0,0, 
1,0,0,0,0,0,0,0,0, 
2,0,0,0,0,0,0,0,0, 
3,0,0,0,0,0,0,0,0, 
4,0,0,0,0,0,0, 
0, 
5,0,0,0,0,0,0,0,0, 
6,0,0,0,0,0,0,0,0, 
7,0,0,0,0,0,0,0,0, 
8,0,0,0,0,0,0,0,0, 
9,0,0, 
0,0,0, 
10,0,0,0,0, 
11,0,0,0,0,0,0,0,0, 
12,0,0,0,0,0,0,0,0, 
13,0,0,0,0,0,0,0,0, 
14,0,0,0,0,0,0,0,0, 
15,0,0,0,0,0,0,0,0, 
16,0,0,0,0,0,0,0,0, 

它不时返回给我一个不完整的buf

回答

0

恕我直言,你必须改变你的程序架构。这里有很多漏洞。

  • 您每x毫秒调用一个函数,以及在哪里可以保证它会在下一个x毫秒发生时完成。
  • 你运行你从gui听 - 所以,你的gui正在等待,而不是在这里重新粉刷。在后台做。
  • 如果你说,那个函数返回什么 - 你的return在哪里?重写你的代码。

希望这个建议对您有所帮助!祝你好运!