上位机通过PDIUSBD12与下位机通信 请教各位高人!USB我用的是PDIUSBD12驱动。上位机测试程序是MFC编写的现在问题是上位机能通过USB发送指令给测试板,测试板的LED灯会亮,但却接受不到数据,调试发现数据内存为空。是端口设置不对还是什么原因? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 UINT ReadReportThread(LPVOID pParam){ CMyUsbHidTestAppDlg *pAppDlg; DWORD Length, Counter; UINT i; CString Str; //将参数pParam取出,并转换为CMyUsbHidTestAppDlg型指针, //以供下面调用其成员函数。 pAppDlg=(CMyUsbHidTestAppDlg*)pParam; //该线程是个死循环,直到程序退出时,它才退出 while(1) { //设置事件为无效状态 ResetEvent(ReadOverlapped.hEvent); //如果设备已经找到 if(MyDevFound==TRUE) { if(hReadHandle==INVALID_HANDLE_VALUE) //如果读句柄无效 { pAppDlg->AddToInfOut("无效的读报告句柄,可能是打开设备时失败"); } else //否则,句柄有效 { //则调用ReadFile函数请求9字节的报告数据 ReadFile(hReadHandle, ReadReportBuffer, 9, NULL, &ReadOverlapped); } //等待事件触发 WaitForSingleObject(ReadOverlapped.hEvent,INFINITE); //如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound //被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。 if(MyDevFound==FALSE) continue; //如果设备没有被拔下,则是ReadFile函数正常操作完成。 //通过GetOverlappedResult函数来获取实际读取到的字节数。 GetOverlappedResult(hReadHandle,&ReadOverlapped,&Length,TRUE); //如果字节数不为0,则将读到的数据显示到信息框中 if(Length!=0) { pAppDlg->AddToInfOut("读取报告"+pAppDlg->itos(Length)+"字节"); Str=""; for(i=0;i<Length;i++) { Str+=pAppDlg->itos(ReadReportBuffer[i],16).Right(2)+" "; } pAppDlg->AddToInfOut(Str, FALSE); } //如果字节数为9,则说明获取到了正确的9字节报告 if(Length==9) { //第一字节为报告ID,应该为0 if(ReadReportBuffer[0]==0) { //第二字节为按键状态,将其保存到KeyStatus中。 KeyStatus=ReadReportBuffer[1]; //刷新按键的情况。 pAppDlg->SetKeyStatus(); //第3、4、5、6字节为设备返回的发送次数值。计算出值后并显示。 Counter=ReadReportBuffer[5]; Counter=(Counter<<8)+ReadReportBuffer[4]; Counter=(Counter<<8)+ReadReportBuffer[3]; Counter=(Counter<<8)+ReadReportBuffer[2]; pAppDlg->SetCounterNumber(Counter); } } } else { //阻塞线程,直到下次事件被触发 WaitForSingleObject(ReadOverlapped.hEvent,INFINITE); } } return 0;}其中调试时ReadReportBuffer为0,数据长度为0 关于异步式WSASENDTO 各位高手,帮个忙看一下啊! 如何在程序中注册和注销自己写的activeX控件?? 低手求救,在线等。 如何从执行程序名称获取它运行时的进程号。从而只启动一次该进程 如何调用WIN2000的信使服务 那位大虾能告诉我vc++里编译使出现内部编译错误怎么解决 请问一些注册表里中些键值可以让程序在系统启动里自动启动?包括启动DLL的 谁有.net注册码?50分 请教大家一个关于视频采集的问题~ 要做个实时视频监控的应用,电脑之间的,求思路 vc中关闭excel线程 进程通信,考虑实现两个com服务类,互相调用,除了这个方式,还有没有更好的啊
{
CMyUsbHidTestAppDlg *pAppDlg;
DWORD Length, Counter;
UINT i;
CString Str; //将参数pParam取出,并转换为CMyUsbHidTestAppDlg型指针,
//以供下面调用其成员函数。
pAppDlg=(CMyUsbHidTestAppDlg*)pParam; //该线程是个死循环,直到程序退出时,它才退出
while(1)
{
//设置事件为无效状态
ResetEvent(ReadOverlapped.hEvent); //如果设备已经找到
if(MyDevFound==TRUE)
{
if(hReadHandle==INVALID_HANDLE_VALUE) //如果读句柄无效
{
pAppDlg->AddToInfOut("无效的读报告句柄,可能是打开设备时失败");
}
else //否则,句柄有效
{
//则调用ReadFile函数请求9字节的报告数据
ReadFile(hReadHandle,
ReadReportBuffer,
9,
NULL,
&ReadOverlapped);
} //等待事件触发
WaitForSingleObject(ReadOverlapped.hEvent,INFINITE); //如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound
//被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。
if(MyDevFound==FALSE) continue; //如果设备没有被拔下,则是ReadFile函数正常操作完成。
//通过GetOverlappedResult函数来获取实际读取到的字节数。
GetOverlappedResult(hReadHandle,&ReadOverlapped,&Length,TRUE); //如果字节数不为0,则将读到的数据显示到信息框中
if(Length!=0)
{
pAppDlg->AddToInfOut("读取报告"+pAppDlg->itos(Length)+"字节");
Str="";
for(i=0;i<Length;i++)
{
Str+=pAppDlg->itos(ReadReportBuffer[i],16).Right(2)+" ";
}
pAppDlg->AddToInfOut(Str, FALSE);
} //如果字节数为9,则说明获取到了正确的9字节报告
if(Length==9)
{
//第一字节为报告ID,应该为0
if(ReadReportBuffer[0]==0)
{
//第二字节为按键状态,将其保存到KeyStatus中。
KeyStatus=ReadReportBuffer[1]; //刷新按键的情况。
pAppDlg->SetKeyStatus(); //第3、4、5、6字节为设备返回的发送次数值。计算出值后并显示。
Counter=ReadReportBuffer[5];
Counter=(Counter<<8)+ReadReportBuffer[4];
Counter=(Counter<<8)+ReadReportBuffer[3];
Counter=(Counter<<8)+ReadReportBuffer[2];
pAppDlg->SetCounterNumber(Counter);
}
}
}
else
{
//阻塞线程,直到下次事件被触发
WaitForSingleObject(ReadOverlapped.hEvent,INFINITE);
}
}
return 0;
}其中调试时ReadReportBuffer为0,数据长度为0