0

Bluetooth経由でデータを受信し、配列で返す関数を実装しています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 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

IMHO、プログラムのアーキテクチャを変更する必要があります。ここにはたくさんの穴があります。

  • x ミリ秒ごとに関数を呼び出すと、次の x ミリ秒が発生したときに実行されることが保証されます。
  • あなたは gui からリスニングを実行します。つまり、あなたの gui は待機しており、ここで再描画していません。バックグラウンドで実行します。
  • あなたが言うなら、その関数は何かを返します - あなたの はreturnどこですか? コードを書き直してください。

このアドバイスがお役に立てば幸いです。幸運を!

于 2013-02-22T10:12:54.430 に答える