我现在要实现这样的一个效果,通过USB和下位机相连,然后不停给下位机发送0xff协议,下位机就给上位机发送数据,然后通过下位机的数据进行操作,因为如果发送数据和操作数据单一线程的话有的时候会有点卡,所以就改用多线程的方式,改后不卡了,但是一旦我拔出USB,那么我的机子就会卡爆掉,各位大侠帮我看看,代码如下发送协议的代码BOOL OnSendSimple(unsigned char command,unsigned char data)
{      DWORD dwactlen=1;
DWORD dwLength;
int len; //要发送的字符长度
len=1;
// CString Rev_Data;
unsigned char *psendbuf=new unsigned char[len];  //unsigned 范围0~255
unsigned char recvBuf[1024];
     memset(recvBuf,0,1024);
psendbuf[0]=command;
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(m_hCom,psendbuf,len,&dwactlen,NULL);
//Sleep(10);
ReadFile(m_hCom,recvBuf,1024,&dwLength,NULL);
        if(dwLength==0)
{

// AfxMessageBox(_T("COM3通讯失败!"));
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
WriteFile(m_hCom,psendbuf,len,&dwactlen,NULL);
Sleep(1);
ReadFile(m_hCom,recvBuf,1024,&dwLength,NULL);
if(dwLength==0)
{
PurgeComm(m_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
WriteFile(m_hCom,psendbuf,len,&dwactlen,NULL);
Sleep(15);
ReadFile(m_hCom,recvBuf,1024,&dwLength,NULL);
if(dwLength==0)
{
AfxMessageBox(_T("COM3通讯中断err1,请检查设备电源是否已连接或USB松动!"));
ClosePort();
// OpenPort(_T("COM4:"),57600,8,ONESTOPBIT,NOPARITY); //自动重新连接
return FALSE; //发送失败
}
}
}
else
{
Pre_Data = (int)recvBuf[4]*256+(int)recvBuf[5];
return true;
}
}
下面这个OnTimer方法是用来不停发送协议的void CPlayMode::OnTimer(UINT nIDEvent) 
{ switch(nIDEvent)
{
case 1:                                      //定时向下位机发送数据0xff
        KillTimer(1);   
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID); //创建线程
if(i == 1)
{
isStop = false;
break;
}
else
{ SetTimer(1,20,NULL);
        } }
CDialog::OnTimer(nIDEvent);
}
上面的i和isStop我是定义的外部变量volatile UINT i;                               //线程返回值
volatile BOOL isStop;
在OnInitDialog()方法里我调用SetTimer(1,20,NULL);创建线程的线程函数如下void ThreadFunc()
{
        CCureGame CCG;         //模拟鼠标移动的游戏类
BOOL flag,flag1;
        ConnectPort CP;
    flag = true;
CCG.MouseMode();
isStop = true;
while(isStop)
{
 flag1 = CP.OnSendSimple(0xff,flag);
 if(flag1)
 {
 i = 0;
 }
 else
 {
     i = 1;
 }
        }}
我是这样想的,当USB被拔出时,OnSendSimple返回的就是false,那么这个时候flag1就是false,so设置i = 1,然后在OnTimer方法里对i进行判断,为1就break,结果这样做后我插上usb可以很顺畅的运行,但是一拔出的话就使命的弹出“COM3通讯中断err1,请检查设备电源是否已连接或USB松动!”,特别卡,请各位帮帮忙,急,谢谢了

解决方案 »

  1.   

    我单步调试的时候中在 flag1 = CP.OnSendSimple(0xff,flag);这里就又跳回   CCureGame CCG;         //模拟鼠标移动的游戏类 
    重新往下走,然后到flag1 = CP.OnSendSimple(0xff,flag);又往回走,各位帮帮忙吧
      

  2.   

    如何得到USB设备的插拔消息
      

  3.   

    返回FALSE,不就是获得消息了吗?
      

  4.   


    我单步调试的时候它不往下走到if(flag1)
             {
                 i = 0;
             }
             else
             {
                 i = 1;
             }这里,这是怎么回事呀,谢谢
      

  5.   

    有没OnSendSimple函数的说明,仔细看看sdk```