| | | 楼主 作者:mark 发表时间:2010-9-2 16:32:57 | |
USB不能读数据
大侠们。我用论坛里的USB例子,做好了,但是不能读数据,这是为什么?我输入123它给我的是“烫烫烫烫”莫非是类型不匹配?谁知道啊?就是论坛里面给我的源代码。
回复楼主
|
 | | 第1楼 作者:强强 发表时间:2010-9-2 18:55:05 | | |
你应该讲清楚是哪一节,哪个例子,必要时还要贴出源代码,把问题讲清楚点,这样才好帮你呀
回复楼主 回复第1楼
|
 |  | | 第2楼 作者:mark 发表时间:2010-9-2 19:43:10 | | | |
谢谢!
是论论坛上的EASY USB 51 Programer:如何与HID设备通讯2中的MFC- void CEasyUSB51ProgramerTest1Dlg::OnBtnWrite()
{ - unsigned char ucTxBuffer[64];
unsigned char ucRxBuffer[64]; -
UpdateData(TRUE); -
- if(m_strTx.GetLength()>64)
{ - AfxMessageBox("发送字节数不能超过64个字节");
} -
- for(int i=0; i<64 ; i++)
{ - if(i <= (m_strTx.GetLength()-1) )
ucTxBuffer[i] = m_strTx.GetAt(i); - else
ucTxBuffer[i] = 0; - }
-
m_MyHidDevice.WriteHid(ucTxBuffer,64); -
m_MyHidDevice.ReadHid(ucRxBuffer,64); -
m_strRx = ucRxBuffer; - UpdateData(FALSE);
- }
- 这部分,我是按照你的做的,但是最后ReadHid读不出数据啊。读出的情况就是我在贴子上朔的情况?这是怎么回事呢?
回复楼主 回复第2楼
|
 |  |  | | 第3楼 作者:强强 发表时间:2010-9-2 21:21:26 | | | | |
估计程序中数据类型或指针有问题,上位机或者下位机都有可能,可以用BusHound监视下位机发过来的数据正常与否
回复楼主 回复第3楼
|
 |  |  |  | | 第4楼 作者:mark 发表时间:2010-9-2 21:48:25 | | | | | |
您有QQ没?呵呵,我在帮做项目,很急,你能不能帮帮忙?我的qq:37358645万分感谢!
回复楼主 回复第4楼
|
 |  |  |  | | 第5楼 作者:mark 发表时间:2010-9-2 21:52:26 | | | | | |
我用Bushound试过,下位机数据是正确的。不过下位机穿的数据是八位的数字,我怎么进行转化?我强转过的都不成功。
回复楼主 回复第5楼
|
 |  |  |  |  | | 第6楼 作者:强强 发表时间:2010-9-2 22:07:39 | | | | | | |
这要看你下位机发过来的数据是怎么编码的了
必须要了解下位机发送上来的数据含义,上位机才好解析。你要实现什么功能?
回复楼主 回复第6楼
|
 |  |  |  |  |  | | 第7楼 作者:mark 发表时间:2010-9-4 17:15:40 | | | | | | | |
我做的就是比如我要传数据给下位机,传的是123,下位机会传回123。但是我的工作伙伴把下位机描述成了键盘,我该怎么办读不出数据啊!
回复楼主 回复第7楼
|
 |  |  |  |  |  |  | | 第8楼 作者:强强 发表时间:2010-9-5 17:28:26 | | | | | | | | |
HID相关那几节有好几个与上位机通讯的实例,可以参考一下
回复楼主 回复第8楼
|
 |  |  |  |  |  |  |  | | 第9楼 作者:mark 发表时间:2010-9-8 0:07:05 | | | | | | | | | |
HID的readfile读不到数据,我debug显示ucRxBuffer没有获得数据
这个问题是不是以内readHID的函数中使用的openHID的函数中已经将句柄给关闭了,所以readfile未能获得句柄而不能读数据的?要不是话还有什么原因?
回复楼主 回复第9楼
|
 | | 第10楼 作者:saliven 发表时间:2010-9-8 9:20:12 | | |
问题处理方法
很可能是因为USB本身是用的两个通道实现读和写的,还有一个通道用于控制命令处理,有一些设备就必需使用不同的打开方式,打开三个句柄,一个用来读,一个用来写,一个用来发送控制信息,这个和你的设备以及操作系统都有关系,所以建议不管如何,都按下面的方式来打开,这个网站提供的程序只打开一个句柄,在有些时候是会出问题的。 打开控制端口应该这样打开:
hDeviceHandle = CreateFile( detailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
打开写入端口应该这样:
hWriteHandle = CreateFile(detailData->DevicePath, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
打开读取端口应该这样:
hReadHandle = CreateFile(detailData->DevicePath, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
然后你做不同操作,用不同的句柄就行了。
注意:键盘和鼠标只能用这种方式打开控制端口,并且应用程序只能打开控制端口,获取一些信息,而不能写入控制信息,并且不能以读写方式打开。
回复楼主 回复第10楼
|
 |  | | 第11楼 作者:mark 发表时间:2010-9-8 14:05:28 | | | |
saliven
怎么加?我家在读的那部分说还要初始化的detaildata。拜托帮我改改啊。谢谢了,很急。
回复楼主 回复第11楼
|
 |  |  | | 第12楼 作者:mark 发表时间:2010-9-8 18:12:18 | | | | |
我在open函数里面加了。
我在openHidDevice里面加了。但是还是没作用。最奇怪的是函数在运行到 m_strRx = ucRxBuffer里面都没读出数,但是运行到后面函数的大括号。ucRxBuffer却有数了。这是为什么?还有读出来的数不能显示。。。。。。。。。
回复楼主 回复第12楼
|
 | | 第13楼 作者:saliven 发表时间:2010-9-9 9:10:55 | | |
操作方法
我应该说的比较清楚了吧,在打开设备函数里,你原来只打开一个句柄,现在改为打开3个。 先打开控制句柄,获取设备的相关信息,发现VendorID、ProductID相同时,再取Capabilities 然后再打开读、写两个句柄。 在其他函数里面,你做不同的操作,用不同的句柄就可以了。 比如你读USB信息,就用读的那个句柄,写入就用写的那个句柄。 对于HID模式,控制句柄没有太大用处,控制指令已经由操作系统搞定了,而对于自定义模式,这个句柄很重要。
回复楼主 回复第13楼
|
| | |