HID设备如何收发数据?需不需要类似串口通信的什么通信协议,

beiyiwangdeshen 2014-10-15 11:05:18
如题。
以前一直做串口通信,协议什么的也比较清楚了。
最近来了个HID设备(血氧仪),属于usb类的,还给了个相关协议,但是看着跟串口协议挺像的,不知道是不是这个协议,关键是没弄过。
从网上找了很多HID通信的Demo,国内的国外的,在其中把vid和pid都设置正确了的,能正确识别设备但还是不能正确收发数据,看了看里面的代码好像也没特别的用到什么协议。
不知道是用错了还是必须要什么协议支持,求高手赐教
...全文
10576 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
三行情诗 2017-03-14
  • 打赏
  • 举报
回复
我现在要要HID实现安卓端和PC端两端通信,刚接手啥都不懂
三行情诗 2017-03-14
  • 打赏
  • 举报
回复
现在也在研究HID通信,楼主还在吗,加QQ530726074我们互相探讨交流啊
  • 打赏
  • 举报
回复
谢谢你的问题专栏
若拙守愚 2016-12-06
  • 打赏
  • 举报
回复
我的 过程是 通过HID设备的句柄,直接自己定义一个缓冲区,总是读不到数据,看了你的贴,感觉少了些什么,楼主 你qq多少 我的1131393555 急需解决
beiyiwangdeshen 2014-11-03
  • 打赏
  • 举报
回复
谢谢大家的回复,问题已经解决了,是我写数据命令格式有问题。各种资料上都说,命令前要加报告ID,我就把这个加上,1、2、3、4之类的,实际上要按我们自己定义的格式输入,a5 后面数据的长度 各种命令 验证码........................... 或许这个a5就是报告id吧。 我在想,要有个现成的操作HID设备的类就好了,或者dll什么的
fang 2014-10-30
  • 打赏
  • 举报
回复
m_hReadHandle=CreateFile(MyDevPathName, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, //FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, FILE_ATTRIBUTE_NORMAL, NULL); m_hWriteHandle=CreateFile(MyDevPathName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, //FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, FILE_ATTRIBUTE_NORMAL, NULL); 创建了两个一样的啊, 函数是这么调用的:WriteFile(m_hWriteHandle, pcBuffer, szLen, &BytesWritten, &overlapped) m_hWriteHandle这个句柄有效?
笨笨仔 2014-10-27
  • 打赏
  • 举报
回复

	HANDLE hOut;
	hOut=CreateFile(devName,						// 设备路径
			GENERIC_READ|GENERIC_WRITE,				// 访问方式
			FILE_SHARE_READ|FILE_SHARE_WRITE,		// 共享模式
			NULL,									// SECURITY_ATTRIBUTES 类型指针
			OPEN_EXISTING,							// 文件不存在时返回失败
			FILE_FLAG_OVERLAPPED,					// 以重叠(异步)模式打开
			NULL);									// 模板文件句柄
beiyiwangdeshen 2014-10-27
  • 打赏
  • 举报
回复
引用 19 楼 fang098 的回复:
把你的CreateFile创建m_hWriteHandle的函数贴下,还有你的overlapped赋值处理过程贴下。第四个参数你赋值为0看看。
m_hReadHandle=CreateFile(MyDevPathName, 
								GENERIC_READ,
								FILE_SHARE_READ|FILE_SHARE_WRITE, 
								NULL,
								OPEN_EXISTING,
								//FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
								FILE_ATTRIBUTE_NORMAL,
								NULL);
m_hWriteHandle=CreateFile(MyDevPathName, 
								GENERIC_WRITE,
								FILE_SHARE_READ|FILE_SHARE_WRITE, 
								NULL,
								OPEN_EXISTING,
								//FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
								FILE_ATTRIBUTE_NORMAL,
								NULL);
OVERLAPPED overlapped;
		memset(&overlapped, 0, sizeof(overlapped));
		overlapped.hEvent = m_hWriteEvent;

m_hWriteEvent(CreateEvent(NULL,TRUE,FALSE,NULL))

第五个参数赋0吧?已经试过,不行的。第四个是取写入数据的长度,初始化就是0.
beiyiwangdeshen 2014-10-27
  • 打赏
  • 举报
回复
厂家发测试工具了,Bus Hound能捕获到设备和电脑的通信,

命令比文档上给的多个a5, 04,04是长度,主机往电脑写入0 a5 04 10 03 00 00
用writefile还报参数错误,用HidD_SetOutputReport报数据错误(循环冗余检查)
写报告打开方式(同步异步)和createfile保持一致了
用户 昵称 2014-10-23
  • 打赏
  • 举报
回复
引用 16 楼 beiyiwangdeshen 的回复:
[quote=引用 15 楼 jennyvenus 的回复:] 如果有其他的程序能操作,用bus hound工具查看一下通讯数据。
用手机端的工具测了下,协议应该没问题,但在电脑端writefile往里写数据,一直返回87(参数错误), 是不是发送命令长度不对? 调试的是这条命令: 03H 设备连接 * V1.1 格式: ASCII : SYNC ETX NULL NULL HEX : 10 03 00 00 功能: 从设备与主设备建立连接。 应答: ASCII : SYNC ETX LEN ACK HEX : 10 03 00 XX ◆ 当ACK为零时,表示连接成功; ◆ 当ACK为非零时,表示连接失败,详见表-1错误码表。 函数是这么调用的:WriteFile(m_hWriteHandle, pcBuffer, szLen, &BytesWritten, &overlapped) 第一个参数是句柄,不用多说 第二个参数根据厂家说的发送指令报不超过64字节,是个65字节的数组,第一字节放报告ID,默认0,第二三四五分别是上面的10、03、00、00,后面全是初始化0; 第三个参数是命令长度64+1=65 第四个参数取写入的字节数 第五个和createfile保持一致,采用异步方式 哪里还有错?难道是第三个参数长度得与第二个匹配,实际多少就得多长?还是? 再劳烦各位,若能帮我解决问题,除积分答谢,其他的都好商量! [/quote] 好像有setfeature和writefile两种方式来操作hid设备。
beiyiwangdeshen 2014-10-23
  • 打赏
  • 举报
回复
引用 15 楼 jennyvenus 的回复:
如果有其他的程序能操作,用bus hound工具查看一下通讯数据。
用手机端的工具测了下,协议应该没问题,但在电脑端writefile往里写数据,一直返回87(参数错误), 是不是发送命令长度不对? 调试的是这条命令: 03H 设备连接 * V1.1 格式: ASCII : SYNC ETX NULL NULL HEX : 10 03 00 00 功能: 从设备与主设备建立连接。 应答: ASCII : SYNC ETX LEN ACK HEX : 10 03 00 XX ◆ 当ACK为零时,表示连接成功; ◆ 当ACK为非零时,表示连接失败,详见表-1错误码表。 函数是这么调用的:WriteFile(m_hWriteHandle, pcBuffer, szLen, &BytesWritten, &overlapped) 第一个参数是句柄,不用多说 第二个参数根据厂家说的发送指令报不超过64字节,是个65字节的数组,第一字节放报告ID,默认0,第二三四五分别是上面的10、03、00、00,后面全是初始化0; 第三个参数是命令长度64+1=65 第四个参数取写入的字节数 第五个和createfile保持一致,采用异步方式 哪里还有错?难道是第三个参数长度得与第二个匹配,实际多少就得多长?还是? 再劳烦各位,若能帮我解决问题,除积分答谢,其他的都好商量!
fang 2014-10-23
  • 打赏
  • 举报
回复
把你的CreateFile创建m_hWriteHandle的函数贴下,还有你的overlapped赋值处理过程贴下。第四个参数你赋值为0看看。
beiyiwangdeshen 2014-10-23
  • 打赏
  • 举报
回复
引用 17 楼 jennyvenus 的回复:
[quote=引用 16 楼 beiyiwangdeshen 的回复:] [quote=引用 15 楼 jennyvenus 的回复:] 如果有其他的程序能操作,用bus hound工具查看一下通讯数据。
用手机端的工具测了下,协议应该没问题,但在电脑端writefile往里写数据,一直返回87(参数错误), 是不是发送命令长度不对? 调试的是这条命令: 03H 设备连接 * V1.1 格式: ASCII : SYNC ETX NULL NULL HEX : 10 03 00 00 功能: 从设备与主设备建立连接。 应答: ASCII : SYNC ETX LEN ACK HEX : 10 03 00 XX ◆ 当ACK为零时,表示连接成功; ◆ 当ACK为非零时,表示连接失败,详见表-1错误码表。 函数是这么调用的:WriteFile(m_hWriteHandle, pcBuffer, szLen, &BytesWritten, &overlapped) 第一个参数是句柄,不用多说 第二个参数根据厂家说的发送指令报不超过64字节,是个65字节的数组,第一字节放报告ID,默认0,第二三四五分别是上面的10、03、00、00,后面全是初始化0; 第三个参数是命令长度64+1=65 第四个参数取写入的字节数 第五个和createfile保持一致,采用异步方式 哪里还有错?难道是第三个参数长度得与第二个匹配,实际多少就得多长?还是? 再劳烦各位,若能帮我解决问题,除积分答谢,其他的都好商量! [/quote] 好像有setfeature和writefile两种方式来操作hid设备。 [/quote] setfeature是发特征报告的吧,用 NTSTATUS __stdcall HidP_GetCaps ( IN PHIDP_PREPARSED_DATA PreparsedData, OUT PHIDP_CAPS Capabilities );这个方法取得的特征报告长度FeatureReportByteLength是0 报告长度InputReportByteLength、OutputReportByteLength都是64, 是不是改读取报告,而不是特征报告呢? 话说什么时候该用特征报告呢?
用户 昵称 2014-10-18
  • 打赏
  • 举报
回复
如果有其他的程序能操作,用bus hound工具查看一下通讯数据。
beiyiwangdeshen 2014-10-17
  • 打赏
  • 举报
回复
引用 13 楼 wxhxj0268 的回复:
[quote=引用 9 楼 feiyue1206 的回复:] 就我的认知,不了解设备底层通信指令,通信成功的可能性太小。
所谓软件底层是介于设备硬件与应用软件接口之间的部分,也就是设备驱动,而使用HID时,Windows系统已经为我们完成驱动接口,编程唯一的是遵守接口的通信规则。另外,我们大多数的编程都工作在应用层,因为对应用而言已经足够了。仔细研究别人的DEMO,非常有好处,我在开发USB产品初期,也是从研究DEMO入手,再逐步实现自己的设想,直到完成开发。加油!楼主,相信自己。[/quote] 说得好,谢谢您! 在这里能收到一些鼓励的话很有作用啊,看来这些细节具体的东西还得自己根据实际入手做。 现在在测那个通讯协议,估计那个有问题。
笨笨仔 2014-10-16
  • 打赏
  • 举报
回复
引用 9 楼 feiyue1206 的回复:
就我的认知,不了解设备底层通信指令,通信成功的可能性太小。
所谓软件底层是介于设备硬件与应用软件接口之间的部分,也就是设备驱动,而使用HID时,Windows系统已经为我们完成驱动接口,编程唯一的是遵守接口的通信规则。另外,我们大多数的编程都工作在应用层,因为对应用而言已经足够了。仔细研究别人的DEMO,非常有好处,我在开发USB产品初期,也是从研究DEMO入手,再逐步实现自己的设想,直到完成开发。加油!楼主,相信自己。
用户 昵称 2014-10-16
  • 打赏
  • 举报
回复
HidD_GetHidGuid SetupDiGetClassDevs SetupDiEnumDeviceInterfaces .......
孟如庭 2014-10-16
  • 打赏
  • 举报
回复
引用 10 楼 beiyiwangdeshen 的回复:
[quote=引用 9 楼 feiyue1206 的回复:] 就我的认知,不了解设备底层通信指令,通信成功的可能性太小。
底层通信指令是硬件开发用的吧,通信只需要从软件层面,用到厂家协议?[/quote] 当然。举个例子,设备里的嵌入式程序如果规定通信前三个字节必须是1,2,3,那你随便发肯定错
beiyiwangdeshen 2014-10-16
  • 打赏
  • 举报
回复
引用 5 楼 jennyvenus 的回复:
HidD_GetHidGuid SetupDiGetClassDevs SetupDiEnumDeviceInterfaces .......
这些识别设备的操作我已经做到了。。现在我是想根据协议收发数据
beiyiwangdeshen 2014-10-16
  • 打赏
  • 举报
回复
引用 9 楼 feiyue1206 的回复:
就我的认知,不了解设备底层通信指令,通信成功的可能性太小。
底层通信指令是硬件开发用的吧,通信只需要从软件层面,用到厂家协议?
加载更多回复(8)
史上最全USB HID开发资料,悉心整理一个月,亲自测试。 涉及STM32 C51 8051F例子都有源码,VC上位机例子以及源码,USB协议,HID协议,USB抓包工具,开发文档,开发过程文档。 详细内容就不都说了,看目录。 有了这个资料包,你再说开发不了USB HID,打死我都不信! 好资料当然一分都不能少! 目录: STM32_USB_HID_PC_demo:USB HID Demonstrator Release软件和文档 STM32_USB_HID_分析:STM32 USB HID 固件学习分析 STM32_USB_HID_例子:STM32 USB HID方式收发例子。 STM32_USB_HID_学习心得:基于STM32 的USB程序开发笔记、修改STM32的USB例程为自己所用、初涉USB,初学者USB入门总结——枚举。 STM32_固件库说明文档:STM32_USB_Demo例子的中文说明文档。 STM32F107 鼠标USB改 HID数据发送程序。 USB_HID_8051F例子。 USB_HID_C51源码。 USB_HID_PC_源码:PC端打开HID设备、读写操作实例。 USB_HID_PC接收发送工具:用于调试USB HID设备,就相当于串口工具啦。自己写好了HID设备,用它接收发送调试非常方便。 USB_HID_PC通信详解:PC端HID读写操作说明。 USB_HID_VC++6.0_入门级例子:简单读写USB HID设备,很好的参考作用。 USB_HID_VC++6.0_入门级例子开发步骤(图解说明,真详细啊!):一步一步手把把手教你开发VC++6.0 USB HID程序。 USB_HID_VC++6.0读写设备源码:简单打开HID设备,读写源码,参考的好例子。 USB_HID_VC++6.0源码:出具雏形的VC++6.0 USB HID 工具源码。非常完善了,可以直接当工具使用,关键是有源码! USB_HID_开发过程详细说明:长篇论文一篇,详细说明HID开发过程,包括下位机、上位机、HID驱动的开发,牛! USB_HID协议(英文)。 USB_STM32_HID开发笔记:里面有USB设备枚举的详细过程,抓包说明的哦。当然包括开发过程啦。令牌包、握手包、数据包中的数据都看得到。 USB_URB分析:抓包工具抓到的数据包的详细解析。 USB_VC教程:短论文一篇,用VC++编写USB接口通信程序,简洁扼要说明VC++6.0开发步骤,提纲挈领,值得一看! USB2.0协议(英文)。 USB技术规范(中文):中文的USB技术规范说明,中文的! USB抓包软件:两种抓包工具,bushound和usbtrace。都是破解版,哈哈,自己偷着乐吧! 深入解析STM32_USB库:STM32 USB的库说明。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧