社区

硬件/系统 帖子详情 请问:串口通信中 "超时重发" 问题的最佳解决方法? 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写文章