2013-02-21 21 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在哪裏?重寫你的代碼。

希望這個建議對您有所幫助!祝你好運!