网站导航:首页 > 论坛 > USB > 帖子浏览
   您正在浏览第 726 号帖子 收藏该帖

楼主 作者: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
  1. void CEasyUSB51ProgramerTest1Dlg::OnBtnWrite()    
  2. {   
  3.     unsigned char ucTxBuffer[64];   //发送缓冲   
  4.     unsigned char ucRxBuffer[64];   //接收缓冲   
  5.   
  6.     UpdateData(TRUE);   
  7.   
  8.     //判断发送框中内容是否超过64字节   
  9.     if(m_strTx.GetLength()>64)   
  10.     {   
  11.         AfxMessageBox("发送字节数不能超过64个字节");   
  12.     }   
  13.   
  14.     //准备发送缓冲区中的内容   
  15.     for(int i=0; i<64 ; i++)   
  16.     {   
  17.         if(i <= (m_strTx.GetLength()-1) )   
  18.             ucTxBuffer[i]   = m_strTx.GetAt(i);   
  19.         else  
  20.             ucTxBuffer[i]   = 0;   
  21.     }   
  22.   
  23.     //写操作   
  24.     m_MyHidDevice.WriteHid(ucTxBuffer,64);   
  25.     //读操作   
  26.     m_MyHidDevice.ReadHid(ucRxBuffer,64);   
  27.   
  28.     m_strRx     = ucRxBuffer;   
  29.     UpdateData(FALSE); 
  30. }
  31. 这部分,我是按照你的做的,但是最后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楼

 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4