天天看點

網關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

網關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

網關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,一直查詢完所有節點。

繼續閱讀