在释放数据之前,请先将阵列填满

Make the array full before releasing data

本文关键字:阵列 释放 数据      更新时间:2023-10-16

我正在实现一个函数,该函数通过蓝牙接收数据并在数组unsigned char buf[10]中返回数据。这是我的函数,每x毫秒通过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 okn");
                    begin = 1;
                }
                else
                {
                    printf("crc failn");
                    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,

它不时地向我返回一个不完整的CCD_ 7。

IMHO,您必须更改程序的架构。这里有很多洞。

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

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