社区
硬件/系统 帖子详情 请问:串口通信中 "超时重发" 问题的最佳解决方法? Engineast 2004-08-12 10:43:12 请问:串口通信中 "超时重发" 问题的最佳解决方法?
我是用定时器实现的,
具体是这样做的:
当 "串口收到数据" 或者 "定时器到时" 都会自动触发对数据的处理事件,
如果数据为空,则判为超时,继续重发;
如果不空,则对数据进行校验.
不知道这样做对整个系统的工作效率是否会有影响?
请问大家还有什么更好的方法,可以提高运行效率?
...全文
736 8 打赏 收藏 请问:串口通信中 "超时重发" 问题的最佳解决方法? 请问:串口通信中 "超时重发" 问题的最佳解决方法? 我是用定时器实现的, 具体是这样做的: 当 "串口收到数据" 或者 "定时器到时" 都会自动触发对数据的处理事件, 如果数据为空,则判为超时,继续重发; 如果不空,则对数据进行校验. 不知道这样做对整个系统的工作效率是否会有影响? 请问大家还有什么更好的方法,可以提高运行效率? 复制链接
扫一扫 分享 转发到动态 举报 AI 作业
写回复 配置赞助广告取 消
确 定
用AI写文章 8 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 EY3 2004-08-15 打赏举报 回复 还是跟我联系吧
呵呵 Engineast 2004-08-14 打赏举报 回复 最后一次顶
谢谢帮助 DentistryDoctor 2004-08-12 打赏举报 回复 应用层的应答机制。 stevecrisewu 2004-08-12 打赏举报 回复 定时器?定时扫描吗?
Mscomm不是采取得消息么?你在对它的事件处理函数中处理你的数据就行了啊
Engineast 2004-08-12 打赏举报 回复 顺便说一下,我采用的是Mscomm控件. Engineast 2004-08-12 打赏举报 回复 我用定时器也能实现预期效果,不这样做是否妥当???
附上源代码:
void CComTestView::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k { BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 strRXData+=strtemp; //加入接收编辑框对应字符串 } } m_strRXData+="接收成功! "; OnTimer(1); //收到数据可提前出发定时器,提高运行效率 } void CComTestView::OnQueryTask() { UpdateData(TRUE); nCurrent=0; nTimes=0; strRXData = _T(""); m_strRXData= _T(""); OnSend(scm[nCurrent].chAddr); SetTimer(1,100,NULL); } void CComTestView::OnTimer(UINT nIDEvent) { if(nIDEvent==1) { CString s; s.Format("%d ",nCurrent); if(nCurrent>=nJudge) //轮询完毕 { KillTimer(1); nCurrent=0; UpdateData(FALSE); return; } else { if(strRXData=="") { nTimes++; m_strRXData+="接收超时! "; } else { s.Format("%d ",strRXData.GetAt(0)); if(strRXData.GetAt(0)!=scm[nCurrent].chAddr) { nTimes++; m_strRXData+=" 返回 "+s+" ---------> 不符!\r\n"; } else { nTimes=0; //正确接收,握手成功,转下一单片机 scm[nCurrent++].bConnect=TRUE; m_strRXData+=" 返回 "+s+" ---------> 相符! 与 "+s+" 连接成功\r\n\r\n"; } strRXData = _T(""); } if(nTimes>0&&nTimes<3) { s.Format("%d",nTimes+1); m_strRXData+=" 尝试第 "+s+" 次连接!\r\n"; } if(nTimes>=3) //超时3次,跳过 { nTimes=0; scm[nCurrent++].bConnect=FALSE; //与该单片机连接失败 m_strRXData+=" 断开与 "+s+" 的连接!\r\n\r\n"; } } if(nCurrent { OnSend(scm[nCurrent].chAddr); } UpdateData(FALSE); } CFormView::OnTimer(nIDEvent); } bool CComTestView::OnSend(char chSend) { CString str; str.Format("%c",chSend); m_ctrlComm.SetOutput(COleVariant(str));//发送数据 str.Format("Current = %d ,发送 %d 成功! \r\n",nCurrent,chSend); //为便于显示,char转成int m_strRXData+=str; UpdateData(FALSE); return true; } ahphone 2004-08-12 打赏举报 回复 You can consult the API function WaitCommEvent() and some other function about ...Comm...() Engineast 2004-08-12 打赏举报 回复 定时器?定时扫描吗? Mscomm不是采取得消息么?你在对它的事件处理函数中处理你的数据就行了啊 -------------------------------------------------------------------- 这个我知道 我是超时的问题有什么更好的解决方法? 可以用进程等待,可能比较麻烦吧! MCU初学者Uart串口操作入门程序参考-重发/超时/ACK等 MCU初学者串口操作入门程序 Modbus RTU 通信连接超时参数.docx Modbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docxModbus RTU 通信连接超时参数.docx 串口超时判断 简单的串口超时方法,用IDLE中断,当不知道接收个数多少,也不知道头和尾时,此方法最简单 Visual C++串口通信技术与编程实践 Visual C++串口通信技术与编程实践 求是科技出版社 作者 李现勇编著 有例程介绍 串口收发数据-中断-C语言代码.rar 串口收发数据-中断方式-C语言代码,代码简单,有注释,方便理解 硬件/系统 2,644 社区成员 17,232 社区内容 发帖 与我相关 我的任务 硬件/系统 VC/MFC 硬件/系统 复制链接 扫一扫 分享 确定 社区描述 VC/MFC 硬件/系统 社区管理员 加入社区 获取链接或二维码 近7日 近30日 至今 加载中 查看更多榜单 社区公告 暂无公告 试试用AI创作助手写篇文章吧 + 用AI写文章