VC串口通信中使用MSComm控件接收N多个连续的数据
- UID
- 114293
|
VC串口通信中使用MSComm控件接收N多个连续的数据
做串口通信的都会发现,使用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);
}
通信 |
|
|
|
|
|