一、项目场景:
上位机项目开发过程中,已经有了单发功能:上位机发送一条数据,再接收一条下位机回复的数据帧。在此基础上需要给上位机添加一个循环发送数据帧的功能,初步想法时使用for循环里面调用单发的功能去实现。
代码如下:
for (int i = m_CurLineNo; i <= this.Tx_richTextBox.Lines.length; i++) {
this.Btn_Send_Click(this, null);
}
调试时可以正常的,ctrl + f5运行时不是严格的一发一收:
二、原因分析及解决:
开始以为是代码逻辑不对,发送过去后应该等接收到数据后再发送下一条,但调试时正常啊。考虑到整个收发处理流程是在定时器响应函数里,可能是定时器的调试和运行时的差异导致的。我的理解是单步调试时肯定比正常运行时走的慢,这时定时器这个外设不会停下的,它会自动每隔一段时间就调用响应函数。于是单步调试和运行时的代码执行逻辑是有差异的。
private void Timer_ReveiveTask_Tick(object sender, EventArgs e) {
String error = m_Bussiness.GetError();
if(error == "") { //系统未发生错误
List<SF2ActionBase> actionList = m_Bussiness.ReceiveAction();
foreach (SF2ActionBase action in actionList) {
ReceiveAction(action as Action_Object);
}
m_Busiess.ContinueSendTask();
}
}
经过尝试后,增加了时间间隔(延时加大)会缩小这个差异,运行就正常了。
this.Timer_UpdateTime.Interval = 100;
this.Timer_UpdateTime.Tick += new System.EventHandler(this.Timer_UpdateTime_Tick);