网关1代码流程

       由代码可知,定时器2的中断时间为1s,定时器3的中断时间为0.1s,定时器4的中断时间为2s,中断优先级大小为:定时器2>定时器3>定时器4

1. 网关2先给网关1下发命令,网关1的串口3来接收网关2下发的数据。所以串口3首先发生中断void USART3_IRQHandler(),将串口3接收到的数据存到数组RS485_RX_BUF[RS485_RX_CNT],同时将这一帧数据打印出来,接收完一帧数据后,将check_over置1


2. 0.1s后定时器3发生中断,初始状态下状态机GW_ok_station为Free,定时器3中断10次后,耗时1s,此时定时器2也进来中断,由中断优先级可知,定时器3先暂停中断,让定时器2先发生中断,所以跳转到void TIM2_IRQHandler(void)

3. 由上可知,GW_ok_station仍为Free,check_over为1,所以进入 receiveuart2()函数,解析网关2发来的数据,初始状态下Resolve_Order为 Header ,然后再进入 if(receive_check_SIMfirst(temp_SIM)!=NULL) 进行判断每个数据的值

4.由整个系统框架可知,网关2刚开始下发的是查询命令,所以接收到的Message_sim_data.Command_ID为inquire, 将Message_sim_data.Command_ID赋值给SIM_Command ,判断完所有数据后,返回值为1,继续往下执行switch (Message_sim_data.Command_ID) ,进入case gw_Command_inquire,此时Resolve_Order为inquire_Over,定时器2中断执行完之后,由于GW_ok_station仍为Free,所以再次进入定时器2中断函数,进入 receiveuart2()函数,此时Resolve_Order= inquire_Over,进入case inquire_Over解最后一个字节的数据,然后Reducing_initial_state为1,GW_ok_station为Busy,Resolve_Order为Header,check_over为0

5. 又过0.1s后定时器3发生中断,此时GW_ok_station为Busy,由上一点可知SIM_Command为gw_Command_inquire,一直等待40s,在这40s里定时器2,定时器3和定时器4一直重复地发生中断,但是因为没有任务执行,所以各状态不变。直到40s之后,继续往下执行if(GW_ok_SIMstation==Free_SIMstation),因为初始状态下GW_ok_SIMstation为Free,所以往下执行Command_exe(gw_Command_inquire,Number_nodes)!=NULL,开始查询第一个节点,此时GW_ok_SIMstation为Busy,再进入RS485_Sendsim_Data(ND_IDS,6)函数,将节点ID和命令发给相应的节点

6.将这些数据先发送给串口2,串口2通过485线传给相应的节点,节点接收到后再返回数据给网关1的串口2,串口2产生中断void USART2_IRQHandler(void),将串口2里的数据存到数组SIM_RX_BUF[SIM_RX_CNT]里,再将这帧数据打印出来,接收完之后,check_over_sim置1


7. 1s后定时器2又发生中断,此时GW_ok_station为Busy,check_over_sim也为1,进入case Busy_station,执行 receiveuart3()函数解析节点发过来的数据,进入if(receive_check_Messege(temp_GW)!=NULL)判断各个数据的值,因为GW_Command为gw_Command_inquire,所以将Send_to_GW2赋值给Send_go,退出后继续往下执行,此时GW_ok_SIMstation=0x00;ND_problem_flag=0;ND_problem_count=0;GW_control_problem=0;GW_control_problem_flag=0;control_problem_count=0;check_over_sim=0;

8. 到了第2s,定时器4发生中断,由上可知,Send_go为Send_to_GW2,所以往下执行程序,进入Send_Message()函数,将节点发来的数据存到数组 B2G_GWsta_send_Message[]里,然后再将这组数据发给串口3,串口3再通过485线发给网关2,网关2接收到后再将回复的数据返回给网关1的串口3,串口3接收后产生中断void USART3_IRQHandler(void),将串口3里的数据存到数组RS485_RX_BUF[RS485_RX_CNT],同时将这一帧数据打印出来,接收完一帧数据后,将check_over置1

ae00010401730000002f   此时功能码已变成查询应答3

串口3中断完之后,返回定时器4中断的地方,继续往下执行send_over_togw2为1,Send_go为0,GW_ok_station为Free,然后继续往下执行 if(send_over_togw2==1) ,此时等待10s,在这10s里,定时器2又进来中断,所以跳到定时器2中断里void USART2_IRQHandler(void)

9. 因为GW_ok_station为Free,check_over为1,所以执行receiveuart2(),由上可知,Resolve_Order为Header,进入case Header,执行 if(receive_check_SIMfirst(temp_SIM)!=NULL)函数,判断各个数据的值,这时的命令已变为应答命令gw_Command_response,Resolve_Order为inquire_response_Over,退出定时器2中断,因为定时器3和4没任务执行,各状态不变,1s后定时器2再次发生中断,然后一直进入case inquire_response_Over语句,此时GW_ok_station为Busy,SIM_Command为gw_Command_inquire,GW_ok_SIMstation=Free_SIMstation等等

10. 0.1s后定时器3又发生中断,由上一步可知,GW_ok_station为Busy,SIM_Command为gw_Command_inquire,所以进入

if(Command_exe(gw_Command_inquire,Number_nodes)!=NULL)函数,继续查询第二个节点,步骤跟查询第一个节点一样

 剩下的节点以此类推,查询一个节点就上报一个给网关2,一直查询完所有节点。








猜你喜欢

转载自blog.csdn.net/qq_38021919/article/details/80383152
今日推荐