完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
做串口通信的都会发现,使用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 for(k=0;k // 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 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:17 , Processed in 0.509566 second(s), Total 48, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号