qt程序中hid问题记录

来源:互联网 发布:重庆网上选车牌号软件 编辑:程序博客网 时间:2024/03/29 00:54

1:嵌入式下打开一个设备最好想好是那种方式打开(只读方式,读写方式,阻塞\非阻塞方式)。

有一个项目,用到一个串口,两个hid方式的usb口,大体代码如下

    FD_ZERO(&rd);
    FD_SET(cd_fd, &rd);
    printf("set cd fd\n");
    FD_SET(rf_fd, &rd);
        printf("set rf fd\n");
    FD_SET(button_fd,&rd);
        printf("set button fd\n");
    FD_SET(tl_fd,&rd);
    //FD_SET(usbRf_fd,&rd);
    printf("set usbrf fd\n");
    max_fd=((cd_fd>rf_fd)?cd_fd:rf_fd);
    //max_fd=((max_fd>usbRf_fd)?max_fd:usbRf_fd);
    max_fd=((max_fd>tl_fd)?max_fd:tl_fd);
    max_fd=(button_fd>max_fd)?button_fd:max_fd;
    printf("wait for serial\n");
    while(1)
    {
        //if(select(max_fd+1, &rd, NULL,NULL,&tv)<0)
        if(select(max_fd+1, &rd, NULL,NULL,NULL)<0)
        {
            perror("select fail ");
        }
        else
        {
            if(FD_ISSET(cd_fd, &rd))
            {
                //do
                        //{

                            nBytes = read(cd_fd, (char *) &ev, sizeof(struct input_event));
                            printf("---nBytes=%d----\n",nBytes);
                            if (nBytes > 0)
                            {
                                if (ev.type == 1)
                                {
                                //按键值
                                    if (ev.value == 0)
                                    {
                                        //放开的按键值
                                        printf("nBytes=[%d] type =[%d] code=[%d] value=[%d] \n",
                                        nBytes, ev.type, ev.code, ev.value);
                                        if(ev.code!=28)
                                        {
                                            if(ev.code==11)
                                            {
                                                id_buf[i++]='0';
                                            }else
                                            {
                                                id_buf[i++]='0'+ev.code-1;
                                            }
                                        }

                                    }
                                }

                            }

                        //}while((ev.code!=28)||(ev.value != 0));
                        if((ev.code==28)&&(ev.value == 0))
                        {
                            id_buf[i]='\0';
                            tran.idData=QString::fromLocal8Bit(id_buf,10);
                            //printf("idbuf=%s\n",id_buf);
                            i=0;
                            memset(id_buf,0,10*sizeof(char));
                            qDebug()<<"-----idData="<<tran.idData;
                            emit sigAutoLog(tran);
                        }
            }
            if(FD_ISSET(rf_fd, &rd))      //hid usb设备
            {
                //do
                        //{

                            nBytes = read(rf_fd, (char *) &ev, sizeof(struct     input_event));
                            printf("---nBytes=%d----\n",nBytes);
                            if (nBytes > 0)
                            {
                                if (ev.type == 1)
                                {
                                //按键值
                                    if (ev.value == 0)
                                    {
                                        //放开的按键值
                                        printf("nBytes=[%d] type =[%d] code=[%d] value=[%d] \n",
                                        nBytes, ev.type, ev.code, ev.value);
                                        if(ev.code!=28)
                                        {
                                            if(ev.code==11)
                                            {
                                                id_buf[i++]='0';
                                            }else
                                            {
                                                id_buf[i++]='0'+ev.code-1;
                                            }
                                        }

                                    }
                                }

                            }

                        //}while((ev.code!=28)||(ev.value != 0));

                        if((ev.code==28)&&(ev.value == 0))
                        {
                            id_buf[i]='\0';
                            tran.ammData=QString::fromLocal8Bit(id_buf,12);
                            //printf("idbuf=%s\n",id_buf);
                            i=0;
                            memset(id_buf,0,10*sizeof(char));
                            qDebug()<<"---ammData="<<tran.ammData;
                            emit sigAmmCode(tran);
                        }

            }
            if(FD_ISSET(tl_fd, &rd))
            {
                nread=read(tl_fd, tl_buff, COUNT);
                printf("length=%d,tl_buff=%s\n",nread,tl_buff);
                if(nread<17)
                {
                    tran.taskData=QString::fromLocal8Bit(tl_buff,nread).left(6);
                    qDebug()<<"emit sig task list Code="<<tran.taskData;
                    qDebug()<<"mid(2,1)"<<tran.taskData.mid(1,1);
                    if((tran.taskData.mid(1,1)=="1")||(tran.taskData.mid(1,1)=="0"))
                    {
                        emit sigGetIn(tran);
                    }else
                    {
                        emit sigGetOut(tran);
                    }

                    //browser->setText(QString(cd_buff));
                }
            }
            if(FD_ISSET(button_fd,&rd))
            {
                static int loop=0;
                char currentValue;
                int dsFlag=0;
                printf("enter lock interrupt\n");
                if (read(button_fd, &currentValue, sizeof currentValue) != sizeof currentValue)
                {
                    perror("read buttons:");
                    exit(1);
                }
printf("******butValue=%d,cValue=%d\n",butValue,currentValue);
                if(butValue!=currentValue)
                {
                    butValue=currentValue;
                    if(butValue==48)    //up
                    {
                        printf("---butvalue=48\n");
                        tran.lockFlag=1;
                        dsFlag=1;
                    }else if(butValue==49)    //down
                    {
                        printf("---butvalue=49\n");
                        tran.lockFlag=2;
                        dsFlag=2;
                    }
                    loop++;
                    printf("--sig door state--%d--\n",loop);
                    emit sigDoorState(tran);
                    //emit sigDoorState(dsFlag);
                }
            }
        }
        FD_ZERO(&rd);
        FD_SET(cd_fd, &rd);
        FD_SET(rf_fd, &rd);
        FD_SET(button_fd,&rd);
        FD_SET(tl_fd,&rd);
    }
    close(cd_fd);
    close(rf_fd);
    close(tl_fd);
    close(button_fd);
#endif
}

问题出在红和绿代码上,由于hid窗口是模拟的键盘方式,一个字节一个字节接收,并且并不是都是有用数据,所以如上红色(do ---while)循环方式运行,取到所有有用数据后,hid设备还有其他无用数据,所以下一个(while(1))喜欢还是进的上一个hid 的设备,然后在(do---while)中一直read,但是把hid发送过来的数据都读完后,就阻塞在read函数,整个while(1)循环就不会运行。所以之后改成if((ev.code==28)&&(ev.value == 0)) 的取数据的方式。

2:所有系统下,包括嵌入式的qt界面,hid 的usb设备都会识别焦点,并在可编辑的焦点上自动显示;

之前遇到一个问题,停留在qt的一个界面,但是当我的hid设备有数据的到来的时候,界面就自动跳转到控件焦点停留的那个页面,之后没办法,就在本界面添加了一个可以编辑的控件,并设置其为焦点。当hid设备数据到来时,数据显示到次控件上,界面也不自动跳转了。

0 0
原创粉丝点击