Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux下蓝牙与qt的结合使用_Qt_Bluetooth - Fatal编程技术网

linux下蓝牙与qt的结合使用

linux下蓝牙与qt的结合使用,qt,bluetooth,Qt,Bluetooth,我用C编写了一个程序,通过蓝牙将电脑与设备连接起来。程序从终端运行,接收到的数据也显示在终端中。到目前为止还不错 现在我已经在qt中创建了一个gui,其中的主要目标是显示以前在终端中显示的信息,现在是在qwtplot中显示的信息 到目前为止,我可以通过gui将设备与pc连接起来,但当我从设备请求信息时,它会显示在终端上,但gui开始没有响应 以下是从设备请求信息的插槽: // Main Bluetooth void gui::main_b() { // BLUETOOTH STUFF

我用C编写了一个程序,通过蓝牙将电脑与设备连接起来。程序从终端运行,接收到的数据也显示在终端中。到目前为止还不错

现在我已经在qt中创建了一个gui,其中的主要目标是显示以前在终端中显示的信息,现在是在qwtplot中显示的信息

到目前为止,我可以通过gui将设备与pc连接起来,但当我从设备请求信息时,它会显示在终端上,但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);
}
//主蓝牙
void gui::main_b()
{
//蓝牙技术
int状态,字节\读取;
int conta=0;
文件*数据=NULL;
fd_设置读掩码;
结构时间值电视;
char-buf[101];
int v,v1,v2;
tv.tv_sec=0;
tv.tv_usec=100000;
//标准消息
char*startstr=“@START,0060,FF,12;”;
写入(sock、startstr、strlen(startstr));
data=fopen(“data.txt”,“w”);
而(续<100)
{
int i;
memset(buf,01100);
FD_零点(读取掩码和读取掩码);
FD_套件(插座和读掩码);
如果(选择(255,&readmask,NULL,NULL,&tv)>0)
{
if(FD_ISSET(sock和readmask))
{
智力麻木;
numb=读取(sock,buf,100);
//12位
如果(ui->comboBox->currentIndex()==1)
{
if(numb==14)
{
conta++;
//printf(“接收到%d个字节:\n”,numb);
//计数器的打印
//printf(“%d”,buf[0]);
fprintf(数据,“%d”,buf[0]);
对于(i=1;i
因此,当我单击调用此插槽的按钮时,它将不再允许我使用gui

这在航站楼有效


提前感谢。

您正在运行
,而
循环与GUI在同一线程中,因此事件队列被阻塞。你有两个选择:

  • 在循环过程中,调用
    QCoreApplication::processEvents()
    。这将强制处理事件队列
  • 将while循环逻辑分离到它自己的线程中

第一个更简单,但通常被认为效率低下,因为几乎所有计算机都有多个内核。

您在与GUI相同的线程中运行
循环,因此事件队列被阻塞。你有两个选择:

  • 在循环过程中,调用
    QCoreApplication::processEvents()
    。这将强制处理事件队列
  • 将while循环逻辑分离到它自己的线程中

第一个要简单得多,但通常被认为效率低下,因为几乎所有计算机都有多个核。

您应该使用类并为Qt事件循环指定自己的文件句柄,而不是您自己的
select

还可以使用将套接字转换为QIODevice实例


第三种选择是将您自己的
select
循环放入另一个线程中,这样它就不会阻塞Qt主事件循环。但这将带来相当多的额外复杂性,所以我只能作为最后的手段来做。

您应该使用类并为Qt事件循环提供您自己的文件句柄,而不是您自己的
选择

还可以使用将套接字转换为QIODevice实例


第三种选择是将您自己的
select
循环放入另一个线程中,这样它就不会阻塞Qt主事件循环。但这将带来相当多的额外复杂性,所以我只能作为最后的手段来做。

要么您的代码正在等待阻塞调用返回,要么您的
conta
变量没有增加(考虑到必须通过多少条件,这并不奇怪)。您的
printf
s怎么说?它正在打印值,但当
conta
达到99时,程序崩溃。在此之前,它会冻结。要么您的代码正在等待阻塞调用返回,要么您的
conta
变量没有递增(考虑到必须通过多少条件,这并不奇怪)。您的
printf
s怎么说?它正在打印值,但当
conta
达到99时,程序崩溃。如果它是一个普通的GUI应用程序,那么使用
processEvents
select
的超时时间必须非常短,这会造成不必要的系统负载,所以我不会使用它。它基本上是GUI的休眠和轮询循环…如果它是一个普通的GUI应用程序,那么使用
processEvents
select
的超时时间必须非常短,从而产生不必要的系统负载,所以我不会使用它。它基本上是GUI的睡眠和轮询循环。。。