程序在和下位机通信,插入两个COM口,我现在想实现在通信的过程当中如果将某一个COM拔出,然后再插回去,怎么让它马上继续获取数据,现在我写了个方法,如果一个COM被拔出,然后给所有COM定时发送数据,如果你再将它插入回去,则重新开启该串口进行数据的获取,但是现在出问题了,这个方法可以实现,但是一旦我拔下一个后,另一个获取数据就好卡好卡了,我将代码贴出来,大家帮我分析一下,谢谢了。int GetCommNum()
{
int _u_connectmode=0;
DWORD dwactlen;
DWORD dwLength=0;
int len=1;
unsigned char *psendbuf=new unsigned char[len];
unsigned char *recvBuf=new unsigned char[1024];
psendbuf[0]=0xff;
HAND temphand;
BOOL temp;
Lhand.connect=false;
Rhand.connect=false;
for(int i=1;i<13;i++)
{
(temphand.Port).Format(_T("COM%d"),i);
temp=OpenPort(57600,8,ONESTOPBIT,NOPARITY,&temphand);
if (temp == false)
{
continue;
}
else
{
PurgeComm(temphand.hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
WriteFile(temphand.hComm,psendbuf,len,&dwactlen,NULL); ReadFile(temphand.hComm,recvBuf,1024,&dwLength,NULL); //其实我们接收到的命令应答只是一个字节
if(recvBuf[1]=='L') //
{
Lhand.connect=true;
Lhand.Port=temphand.Port;
}
else if(recvBuf[1]=='R') //
{
Rhand.connect=true;
Rhand.Port=temphand.Port;
}
if(Lhand.connect==true && Rhand.connect==true) //左右手同时插入
{
delete psendbuf;
delete recvBuf;
ClosePort(&temphand);
return 3;
}
ClosePort(&temphand);
}
}这个是获取串口的,遍历一遍所有的串口void CInitData::OnTimer(UINT nIDEvent)
{
CConnectPort CP;
CString Finger1,Finger2,Finger3,Finger4,Finger5,Finger6,Finger7,Finger8,Finger9,Finger10,Finger11,Finger12,Finger13,Finger14,Finger15,Finger16,Finger17,Finger18,Finger19,Finger20,Finger21,Finger22,Finger23,Finger24,Finger25,Finger26,Finger27,Finger28,Finger29,Finger30,Finger31,Finger32,Finger33,Finger34,Finger35,Finger36,Finger37,Finger38,Finger39,Finger40,Finger41,Finger42,Finger43;
UpdateData(FALSE);
Util util;
switch(nIDEvent)
{
case 1: //左手连接,开始接收数据
BOOL flag;
flag= CP.GetData(0xff,16,3,&Lhand);
Finger1.Format("%d",Lhand.ADCData[0]);
Finger2.Format("%d",Lhand.ADCData[1]);
Finger3.Format("%d",Lhand.ADCData[2]);
Finger4.Format("%d",Lhand.ADCData[3]);
Finger5.Format("%d",Lhand.ADCData[4]);
Finger6.Format("%d",Lhand.ADCData[5]);
Finger7 = "0";
SetDlgItemText(IDC_EDIT1,Finger1); //给InitData初始化窗体的左手拇指初始化文本框赋值
SetDlgItemText(IDC_EDIT2,Finger2); //给InitData初始化窗体的左食指指初始化文本框赋值
SetDlgItemText(IDC_EDIT3,Finger3); //给InitData初始化窗体的左中指指初始化文本框赋值
SetDlgItemText(IDC_EDIT4,Finger4); //给InitData初始化窗体的左无名指指初始化文本框赋值
SetDlgItemText(IDC_EDIT5,Finger5); //给InitData初始化窗体的左手小指初始化文本框赋值
SetDlgItemText(IDC_EDIT6,Finger6); //给InitData初始化窗体的左手手腕前初始化文本框赋值
if(!flag)
{
CP.ClosePort(&Lhand);
CP.GetCommNum();
CP.OpenPort(57600,8,ONESTOPBIT,NOPARITY,&Lhand);
}
break; case 2:
BOOL flag2;
flag2 = CP.GetData(0xff,16,3,&Rhand);
Finger22.Format("%d",Rhand.ADCData[0]);
Finger23.Format("%d",Rhand.ADCData[1]);
Finger24.Format("%d",Rhand.ADCData[2]);
Finger25.Format("%d",Rhand.ADCData[3]);
Finger26.Format("%d",Rhand.ADCData[4]);
Finger27.Format("%d",Rhand.ADCData[5]);
Finger28 = "0";
SetDlgItemText(IDC_EDIT22,Finger22);
SetDlgItemText(IDC_EDIT23,Finger23);
SetDlgItemText(IDC_EDIT24,Finger24);
SetDlgItemText(IDC_EDIT25,Finger25);
SetDlgItemText(IDC_EDIT26,Finger26);
SetDlgItemText(IDC_EDIT27,Finger27);
SetDlgItemText(IDC_EDIT28,Finger28); if(!flag2)
{ CP.ClosePort(&Rhand);
CP.GetCommNum();
CP.OpenPort(57600,8,ONESTOPBIT,NOPARITY,&Rhand);
}
break;
}
CDialog::OnTimer(nIDEvent);
}
这个时间方法里我分别对两个串口接收数据,定时为
SetTimer(1,10,NULL);
SetTimer(2,10,NULL);
CP.GetData(0xff,16,3,&Lhand);这个方法是给下位机发送协议0xff的,接收的数据存放在HAND Lhand,Rhand这两个结构体的ADCData里。GetData这个方法返回一个BOOL型,如果为false,说明没有接收到数据,那么就调用GetCommNum()方法进行串口的重新遍历,直到重新插入串口进行获取数据,现在问题来了,我开始将两个串口同时插上,很正常,接收数据很流畅,但是我一旦拔出一个,那么另一个接收就好卡好卡了,后来我找到了原因,把CP.GetCommNum();这个遍历方法一屏蔽掉,拔出一个另一个就很流畅,没有问题,但是这个一屏蔽掉你把拔出来的串口再插回去就没用了,大家伙帮帮忙吧。只剩下这点分了,都拿出来了
{
int _u_connectmode=0;
DWORD dwactlen;
DWORD dwLength=0;
int len=1;
unsigned char *psendbuf=new unsigned char[len];
unsigned char *recvBuf=new unsigned char[1024];
psendbuf[0]=0xff;
HAND temphand;
BOOL temp;
Lhand.connect=false;
Rhand.connect=false;
for(int i=1;i<13;i++)
{
(temphand.Port).Format(_T("COM%d"),i);
temp=OpenPort(57600,8,ONESTOPBIT,NOPARITY,&temphand);
if (temp == false)
{
continue;
}
else
{
PurgeComm(temphand.hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
WriteFile(temphand.hComm,psendbuf,len,&dwactlen,NULL); ReadFile(temphand.hComm,recvBuf,1024,&dwLength,NULL); //其实我们接收到的命令应答只是一个字节
if(recvBuf[1]=='L') //
{
Lhand.connect=true;
Lhand.Port=temphand.Port;
}
else if(recvBuf[1]=='R') //
{
Rhand.connect=true;
Rhand.Port=temphand.Port;
}
if(Lhand.connect==true && Rhand.connect==true) //左右手同时插入
{
delete psendbuf;
delete recvBuf;
ClosePort(&temphand);
return 3;
}
ClosePort(&temphand);
}
}这个是获取串口的,遍历一遍所有的串口void CInitData::OnTimer(UINT nIDEvent)
{
CConnectPort CP;
CString Finger1,Finger2,Finger3,Finger4,Finger5,Finger6,Finger7,Finger8,Finger9,Finger10,Finger11,Finger12,Finger13,Finger14,Finger15,Finger16,Finger17,Finger18,Finger19,Finger20,Finger21,Finger22,Finger23,Finger24,Finger25,Finger26,Finger27,Finger28,Finger29,Finger30,Finger31,Finger32,Finger33,Finger34,Finger35,Finger36,Finger37,Finger38,Finger39,Finger40,Finger41,Finger42,Finger43;
UpdateData(FALSE);
Util util;
switch(nIDEvent)
{
case 1: //左手连接,开始接收数据
BOOL flag;
flag= CP.GetData(0xff,16,3,&Lhand);
Finger1.Format("%d",Lhand.ADCData[0]);
Finger2.Format("%d",Lhand.ADCData[1]);
Finger3.Format("%d",Lhand.ADCData[2]);
Finger4.Format("%d",Lhand.ADCData[3]);
Finger5.Format("%d",Lhand.ADCData[4]);
Finger6.Format("%d",Lhand.ADCData[5]);
Finger7 = "0";
SetDlgItemText(IDC_EDIT1,Finger1); //给InitData初始化窗体的左手拇指初始化文本框赋值
SetDlgItemText(IDC_EDIT2,Finger2); //给InitData初始化窗体的左食指指初始化文本框赋值
SetDlgItemText(IDC_EDIT3,Finger3); //给InitData初始化窗体的左中指指初始化文本框赋值
SetDlgItemText(IDC_EDIT4,Finger4); //给InitData初始化窗体的左无名指指初始化文本框赋值
SetDlgItemText(IDC_EDIT5,Finger5); //给InitData初始化窗体的左手小指初始化文本框赋值
SetDlgItemText(IDC_EDIT6,Finger6); //给InitData初始化窗体的左手手腕前初始化文本框赋值
if(!flag)
{
CP.ClosePort(&Lhand);
CP.GetCommNum();
CP.OpenPort(57600,8,ONESTOPBIT,NOPARITY,&Lhand);
}
break; case 2:
BOOL flag2;
flag2 = CP.GetData(0xff,16,3,&Rhand);
Finger22.Format("%d",Rhand.ADCData[0]);
Finger23.Format("%d",Rhand.ADCData[1]);
Finger24.Format("%d",Rhand.ADCData[2]);
Finger25.Format("%d",Rhand.ADCData[3]);
Finger26.Format("%d",Rhand.ADCData[4]);
Finger27.Format("%d",Rhand.ADCData[5]);
Finger28 = "0";
SetDlgItemText(IDC_EDIT22,Finger22);
SetDlgItemText(IDC_EDIT23,Finger23);
SetDlgItemText(IDC_EDIT24,Finger24);
SetDlgItemText(IDC_EDIT25,Finger25);
SetDlgItemText(IDC_EDIT26,Finger26);
SetDlgItemText(IDC_EDIT27,Finger27);
SetDlgItemText(IDC_EDIT28,Finger28); if(!flag2)
{ CP.ClosePort(&Rhand);
CP.GetCommNum();
CP.OpenPort(57600,8,ONESTOPBIT,NOPARITY,&Rhand);
}
break;
}
CDialog::OnTimer(nIDEvent);
}
这个时间方法里我分别对两个串口接收数据,定时为
SetTimer(1,10,NULL);
SetTimer(2,10,NULL);
CP.GetData(0xff,16,3,&Lhand);这个方法是给下位机发送协议0xff的,接收的数据存放在HAND Lhand,Rhand这两个结构体的ADCData里。GetData这个方法返回一个BOOL型,如果为false,说明没有接收到数据,那么就调用GetCommNum()方法进行串口的重新遍历,直到重新插入串口进行获取数据,现在问题来了,我开始将两个串口同时插上,很正常,接收数据很流畅,但是我一旦拔出一个,那么另一个接收就好卡好卡了,后来我找到了原因,把CP.GetCommNum();这个遍历方法一屏蔽掉,拔出一个另一个就很流畅,没有问题,但是这个一屏蔽掉你把拔出来的串口再插回去就没用了,大家伙帮帮忙吧。只剩下这点分了,都拿出来了
解决方案 »
- socket的close()和shutdown()这两个函数本质区别在哪里?
- 关于COMBOBOXINFO和GetComboBoxInfo问题,前辈们进来指点下!3Q!
- 一出手就是百分,急,向指定另一窗口发送鼠标单击消息失败
- 急!16进制数字怎么转化成对应的字符?
- 请教:窗口分割的问题!
- 请问如何将声音文件预先读入内存?再播放。
- 一个关于加密的入门问题!!!!
- 请问高手,如何突破不该有的网络障碍????我要上网!!!!!我要交流!!!!
- 在win98注册com组件的问题!
- 这是什么原因?
- 为什么ATL工程自动生成的.rgs文件,只有类型库的GUID,没有接口的GUID?
- MFC如何实现带图片背景的字
每个串口,单独运行一个后台线程,线程负责接收和解析数据包,把解析后的数据发送给父窗口处理