android Hid 实现注意事项
来源:互联网 发布:怎么清楚淘宝购买记录 编辑:程序博客网 时间:2024/05/24 05:49
使用cypress平台上时,调试A+G sensor时,通过HID协议在Android上枚举出hid的设备文件,因为A+G是一体的,所以cypress将A+G的数据通过一个HID通道数据发送,android层主动发送取数据的命令,cpress 这面将数据发送到HID设备文件中,但是遇到有时候A+G的数据错乱,但是有时候又不会。
mModule 中存放主要的数据结构,循环中会调用
while (true) {
while (eventQue.size() > 0 && eventNum <= count) {
data[eventNum] = eventQue.front();
eventQue.pop();
eventNum++;
}
if (eventNum > 0)
return eventNum;
num = poll(mModule.pollfds, mModule.count+1, -1);
if (num <= 0) {
err = errno;
LOGE("HidSensors: sensor hal poll error: %d %s", err, strerror(err));
return -err;
}
usleep(50 * 1000);
for (int i = 0; i < mModule.count+1; i++) {
if (mModule.pollfds[i].revents & POLLIN) {
if(i == 0){
num = read(mModule.pollfds[0].fd,pipedata,sizeof(pipedata));
if (num <= 0) {
err = errno;
LOGE("HidSensors: sensor hal read error: %d %s", err, strerror(err));
return -err;
}
mModule.pollfds[pipedata[0]].fd = pipedata[2];
LOGI("HidSensor: sensor hal fd = %d", pipedata[2]);
}
else
mModule.sensors[i-1]->getData(eventQue);
}
else if (mModule.pollfds[i].revents != 0){
mModule.pollfds[i].fd = -1;
LOGE("HidSensors: sensor hal poll event error: %d fd: %d type: %d", mModule.pollfds[i].revents, mModule.pollfds[i].fd, mModule.sensors[i-1]->getDevice().getType());
}
mModule.pollfds[i].revents = 0;
}
}
return -1;
mModule.sensors[i-1]->getData(eventQue);
因为数据错乱的原因:我们分析有以下原因:
1.不同的进程调度,怀疑理由:在PC端开不同的线程读取数据,会发生读出的数据错乱,但是很显然,循环是一个线层,通过加锁也无法避免看来不是这个原因。
2.底层数据错误,实际通过PC端数据顺序读取不会出现问题。
后来突然想到每个sensor的实例都要enable一次,enable函数会打开hid的设备文件,意味着A和G的设备描述符不同的,虽然打开文件相同。应该是文件读写指针不对,后来定义了一个静态fd文件描述符,A+G共享一个,后来成功解决数据错乱的原因。
结论:
1. 由于进程级文件描述符表的存在,不同的进程中会出现相同的文件描述符,它们可能指向同一个文件,也可能指向不同的文件
2. 两个不同的文件描述符,若指向同一个打开文件句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read()、write()或lseek()所致),那么从另一 个描述符中也会观察到变化,无论这两个文件描述符是否属于不同进程,还是同一个进程,情况都是如此。
3.但是在同一线程中不会同步偏移量。
0 0
- android Hid 实现注意事项
- Android Bluetooth HID实现详解
- Android Bluetooth HID实现详解
- Android Bluetooth HID实现详解
- Android Bluetooth HID实现详解
- Android Bluetooth HID实现详解
- Android实现HID鼠标的指针自定义
- HID 读写report ID注意事项
- Android上实现Bluetooth HID device的研究(一)
- Android基于wifi的无线HID设备实现
- Android下自己开发APP实现HID的连接
- Android BluetoothProfile之HID
- android hid map
- 自定义 HID 设备的实现
- HID
- HID
- android HID添加(一)
- Android系统支持HID设备
- vs中应用opencv出现 warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)
- JavaAPI访问Hadoop2.2HA的配置下访问Hbase0.96.2 .
- [nginx] -- nginx配置文件详细解答
- java android 16进制转byte
- 如何很燃地解决问题
- android Hid 实现注意事项
- php中的 header () 函数详解
- AngularJS在实际项目中的应用系列目录
- 汉诺塔算法--java版
- 通过TextSwitcher实现广告栏内容动画切换
- R柱状图,叠图(排序)
- DOS/BAT批处理if exist else 语句的几种用法
- 32、Power Query-利用自定义函数获取指定页数数据
- Linux中如何添加自己的路径为全局路径