兩個設(shè)備通過RF通訊,發(fā)送指令后數(shù)據(jù)交換問題

兩個設(shè)備一個用來發(fā)送命令和接收ADC數(shù)據(jù),另一個接收命令后采集并發(fā)送ADC數(shù)據(jù)

現(xiàn)在我發(fā)送完命令后對ADC數(shù)據(jù)處理時發(fā)現(xiàn)命令發(fā)送完畢立刻處理沒有數(shù)據(jù),下一次發(fā)送命令時才會處理上一次的數(shù)據(jù),落后一個命令,我看RF通訊是有自己的收發(fā)控制,我該在什么時間進行數(shù)據(jù)處理?我現(xiàn)在想的是接收ADC后置標志,標志為1處理ADC,但是擔心這樣會導致時間問題

您好,您是使用AUTO還是BASIC模式的RF收發(fā)。

如果是AUTO模式,原發(fā)送方發(fā)完后會自動切換開啟一段接收窗口,超時或收到回包后結(jié)束本次發(fā)包;為了保證原發(fā)送方在接收窗口內(nèi)及時收到原接收方的回包,原接收方RF_Rx函數(shù)的第一個參數(shù)是預(yù)先填寫的回包,并不是收到包后原樣回傳,這樣原接收方在收到包后不用處理數(shù)據(jù),自動切換成發(fā)送模式直接回包,回完包再自動切換成接收模式繼續(xù)等待收包。這樣會導致“落后一個命令”的現(xiàn)象。如果期望AUTO模式下及時回傳處理的數(shù)據(jù),原接收方在第一次自動回包后及時處理數(shù)據(jù),處理后填寫到RF_Rx函數(shù)中,等待第二次自動回包時返回數(shù)據(jù);原發(fā)送方再次發(fā)送一包數(shù)據(jù),獲取剛剛處理好的數(shù)據(jù)回包。

如果使用BASIC模式,不會有上述問題,收發(fā)都是按用戶邏輯切換的。發(fā)送方只由RF_Tx函數(shù)的第一個參數(shù)決定負載數(shù)據(jù);接收方RF_Rx函數(shù)的第一個參數(shù)不再生效;接收方回包需要手動切換成發(fā)送方,在調(diào)用RF_Tx函數(shù)回包。


問題是我使用BASIC模式的RF收發(fā)出現(xiàn)了延遲問題,我該怎么控制收發(fā)邏輯?

我現(xiàn)在代碼是發(fā)送端使用串口中斷接收上位機命令后開啟發(fā)送信息事件,然后接受端發(fā)送數(shù)據(jù)回來,發(fā)送端再接受到數(shù)據(jù)后進行處理并輸出。

現(xiàn)在根據(jù)打印信息,每次都是收到了回傳信息的,但是發(fā)送端發(fā)送信息事件后直接先輸出了數(shù)據(jù),明明事件的代碼在前面但是事件后執(zhí)行。圖片.png整體的數(shù)據(jù)每次都是先輸出后處理,導致數(shù)據(jù)全都落后一個命令。

下面是部分代碼:

tmos_set_event(taskID,?SBP_RF_COMMAND_EVT);?//發(fā)送事件
ADC=ADC_put(&example);?????//數(shù)據(jù)處理
s=arr;
sprintf(s,"*CFV%02d%06x\r\n",SID,ADC);
checksum=Uart_out(s)?&?0xFF;
PRINT("*CFV%02d%06x%x%x\r\n",SID,ADC,(checksum>>?4)?&?0xF,checksum&?0xF);?//輸出數(shù)據(jù)
tmos_set_event(taskID,?SBP_RF_COMMAND_EVT);?//發(fā)送事件

這行代碼執(zhí)行后事件會立刻執(zhí)行嗎?


您好,處于接收模式時,可以在case RX_MODE_RX_DATA: 分支中,確定收到包并處理好數(shù)據(jù)之后,再啟用一個TMOS事件去切換到發(fā)送模式;處于發(fā)送模式時,可以在case TX_MODE_TX_FINISH:分支中,再啟用一個TMOS事件去切換到接收模式。

調(diào)用tmos_set_event安排事件,下一次主循環(huán)查詢事件標志時,該事件就已經(jīng)置位了,不過同一個taskID下同時置位的事件,先后執(zhí)行順序要看ProcessEvent函數(shù)中該事件ID的處理if分支時寫在前面還是后面。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频