0

我正在实现一个通过蓝牙接收数据并将其返回到数组中的函数unsigned char buf[10]。这是我的函数,每 x 毫秒通过 a 调用一次QTimer

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

4

1 回答 1

0

恕我直言,您必须更改程序的体系结构。这里有很多洞。

  • 您每隔 x 毫秒调用一次函数,并且保证在下一个 x 毫秒发生时会完成。
  • 您从 gui 运行您的聆听 - 所以,您的 gui 正在等待,而不是在这里重新绘制。在后台执行。
  • 如果你说,那个函数会返回一些东西——你的return? 重写你的代码。

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

于 2013-02-22T10:12:54.430 回答