VC串口通信中使用MSComm控件接收N多个连续的数据
时间:10-02
整理:3721RD
点击:
做串口通信的都会发现,使用MSComm控制做串口通信时,当接收数据时只能接收有限长度的数据,如果接收的数据超出一定长度就会多次进入中断函数,导致接收的消息不连续,如何解决这个问题呢,我试过两种方法:
1、在OnComm()中断函数里面接收数据的前面,也就是m_mscomm.GetInPut()函数前加一条语句:Sleep(100),这样可以让接收的数据长一点,但也有很大的缺点,会耗费时间,导致程序运行慢。
2、我认为这个方法是最好的,即:在OnComm()中断函数中,我不对数据进行处理,我还是用程序来说明吧:
void CComunicationSystemDlg::在OnComm()
{
if (m_cMscomm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{
m_cMscomm.SetRThreshold(BUFFER); //
SetTimer(1, 3, NULL); //开启定时器2,每3ms
}
}
数据处理在OnTimer()函数中完成:
void CComunicationSystemDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
CString strtemp, strSave, strGetAddr;
strSave = "";
static LONG OldLen=0, NewLen=0;
switch (nIDEvent)
{
case 1:
{
NewLen = m_cMscomm.GetInBufferCount();
if (OldLen == NewLen)
{
variant_inp=m_cMscomm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,m_byteRxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
// BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%02X ",m_byteRxdata[k]); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
m_strReceiveDown += strtemp; //加入接收编辑框对应字符串
strSave += strtemp;
// m_receiveData[k] = strtemp;
}
// m_k = k;
KillTimer(1);
UpdateData(FALSE);
}
else
OldLen = NewLen;
}
break;
case 2:
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
1、在OnComm()中断函数里面接收数据的前面,也就是m_mscomm.GetInPut()函数前加一条语句:Sleep(100),这样可以让接收的数据长一点,但也有很大的缺点,会耗费时间,导致程序运行慢。
2、我认为这个方法是最好的,即:在OnComm()中断函数中,我不对数据进行处理,我还是用程序来说明吧:
void CComunicationSystemDlg::在OnComm()
{
if (m_cMscomm.GetCommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{
m_cMscomm.SetRThreshold(BUFFER); //
SetTimer(1, 3, NULL); //开启定时器2,每3ms
}
}
数据处理在OnTimer()函数中完成:
void CComunicationSystemDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
CString strtemp, strSave, strGetAddr;
strSave = "";
static LONG OldLen=0, NewLen=0;
switch (nIDEvent)
{
case 1:
{
NewLen = m_cMscomm.GetInBufferCount();
if (OldLen == NewLen)
{
variant_inp=m_cMscomm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,m_byteRxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
// BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%02X ",m_byteRxdata[k]); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
m_strReceiveDown += strtemp; //加入接收编辑框对应字符串
strSave += strtemp;
// m_receiveData[k] = strtemp;
}
// m_k = k;
KillTimer(1);
UpdateData(FALSE);
}
else
OldLen = NewLen;
}
break;
case 2:
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}