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, ¤tValue, 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设备数据到来时,数据显示到次控件上,界面也不自动跳转了。
- qt程序中hid问题记录
- qt程序应用记录
- 【Qt】Linux HID API
- 【Qt】Linux HID API
- 记录平时程序中遇到的问题
- Qt问题记录
- Qt 问题记录
- QT问题记录
- Qt 问题记录
- qt错误问题记录
- Qt问题记录
- QT编程问题记录
- Qt问题记录
- 记录Qt+VS开发过程中遇到的问题
- USB HID调试过程中碰到的一些问题
- 记录ogre中gpu程序在compositor中使用问题
- linux HID 问题
- Linux hid问题
- oracle创建用户及赋权
- Java中的逆变与协变
- eclipse出现莫名奇妙的问题
- 【NuGet】发布流程
- android-Creating a Search Interface
- qt程序中hid问题记录
- 界面跳转设置,及定位服务
- objective-c延展类目协议
- 遥感影像处理
- 单机搭建基于Hadoop的Spark环境
- 异常:could not initialize proxy - no Session
- 简单实例NSFileHandle的文件读写
- Android文件存储位置简述
- POJ 3274 哈希