0

PCをBluetoothでデバイスに接続するプログラムをCで作成しました。プログラムは端末から実行され、受信したデータは端末にも表示されます。ここまでは順調ですね。

これで、qtでGUIを作成しました。主な目的は、以前はターミナルに表示されていた情報を、現在はqwtplotsで表示することです。

さて、これまでのところ、デバイスとPCをGUIで接続できますが、デバイスから情報を要求すると、端末に表示されますが、GUIが応答しなくなります。

デバイスからの情報を要求するスロットは次のとおりです。

// Main Bluetooth
void gui::main_b()
{
    // BLUETOOTH STUFF
    int status, bytes_read;
    int conta = 0;
    FILE *data = NULL;

    fd_set readmask;
    struct timeval tv;
    char buf[101];
    int v, v1, v2;

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

    // Standard messages
    char *startstr = "@START,0060,FF,12;";

    write (sock, startstr, strlen (startstr));

    data = fopen ("data.txt", "w");
    while (conta < 100)
    {
        int i;
        memset (buf, 0, 100);
        FD_ZERO (&readmask);
        FD_SET (sock, &readmask);
        if (select (255, &readmask, NULL, NULL, &tv) > 0)
        {
            if (FD_ISSET (sock, &readmask))
            {
                int numb;
                numb = read (sock, buf, 100);

                // 12 bits
                if (ui->comboBox->currentIndex() == 1)
                {
                    if (numb == 14)
                    {
                        conta++;
                        //printf ("received %d bytes:\n", numb);
                        // print of counter
                        //printf ("%d,", buf[0]);
                        fprintf (data, "%d,", buf[0]);
                        for (i = 1; i < numb-1; i += 3)
                        {
                            v1 = buf[i] | ((buf[i + 1] & 0x0F) << 8);
                            v2 = buf[i + 2];
                            v2 = (v2 << 4) | ((buf[i + 1] & 0xf0) >> 4);
                            printf ("%d,%d,", v1, v2);
                            //fprintf (data, "%d,%d,", v1, v2);
                        }

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

したがって、このスロットを呼び出すボタンをクリックすると、GUIを再度使用することはできません。

これはターミナルで動作します。

前もって感謝します。

4

2 に答える 2

2

独自の の代わりに、QSocketNotifierselectクラスを使用して、Qt イベント ループ用に独自のファイル ハンドルを指定する必要があります。

この QFile::open のオーバーロードを使用して、ソケットを QIODevice インスタンスに変換することもできます。

3 番目の選択肢はselect、Qt のメイン イベント ループをブロックしないように、独自のループを別のスレッドに配置することです。しかし、それは非常に多くの余分な複雑さをもたらすので、私は最後の手段としてのみそれを行います.

于 2013-02-11T18:10:59.770 に答える