我这里有一个HID设备,固件已经写好,我用VC编写了一个HID与PC双向通信的程序,其中用到ReadFile函数读数据,用WriteFile函数写数据。程序将一串字符串写入HID设备,再读出来。VC的程序如下:
void CTest1Dlg::OnWriteDevice() 
{
BYTE wBuffer[33] = {0};
BYTE rBuffer[33] = {0};
char str[32]={'0'};
DWORD dwRet;
UpdateData(true);
memcpy(&wBuffer[1], m_writebuff, min(32, m_writebuff.GetLength()));
if(WriteFile(handle, wBuffer, 33, &dwRet,NULL))
{
//写成功
Sleep(1500);
if(ReadFile(handle, rBuffer, 33, &dwRet, NULL))
{
//读成功
memcpy(str, &rBuffer[1], min(32, strlen((char *)&rBuffer[1])));
m_readbuff=str; }
else
MessageBox("读失败!"); MessageBox("读写成功!");

}
else
MessageBox("写失败!");

}
问题是:在用WriteFile写入数据后如果马上用ReadFile读数据,那么读到的数据是“老值”,只有sleep()后才能读到刚才写入的“新值”。我的判断是IN中断是由PC轮询发出的,因此要有一个延时,等待PC的下一次的IN中断请求,ReadFile函数只是从缓冲区中读数据。我不知道这样的理解对不对,请各位高手指教。我如何才能加快PC与HID设备之间的数据交换速率呢?谢谢!!

解决方案 »

  1.   

    HID设备收到新的字符串之后要有一个处理时间,现在PC的CPU都是3G的,而HID设备的MCU的芯片的速度一般只有几MHz。所以你要等等一下。
      

  2.   

    等待的不是你PC的时间,而是HID的时间,他的处理速度和PC比低很多,所以你必须用延时来和他的时间做匹配
      

  3.   

    谢谢各位!!那么为什么只有sleep()后才能读到刚才写入的“新值”,否则在一定时间内读到的数据仍是上一次的旧值呢。WriteFile和ReadFile操作的缓冲区是不是一个?谢谢!!