我现在要实现这样的一个效果,通过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松动!”,特别卡,请各位帮帮忙,急,谢谢了
{ 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松动!”,特别卡,请各位帮帮忙,急,谢谢了
重新往下走,然后到flag1 = CP.OnSendSimple(0xff,flag);又往回走,各位帮帮忙吧
我单步调试的时候它不往下走到if(flag1)
{
i = 0;
}
else
{
i = 1;
}这里,这是怎么回事呀,谢谢