两个设备通过RF通讯,发送指令后数据交换问题

两个设备一个用来发送命令和接收ADC数据,另一个接收命令后采集并发送ADC数据

现在我发送完命令后对ADC数据处理时发现命令发送完毕立刻处理没有数据,下一次发送命令时才会处理上一次的数据,落后一个命令,我看RF通讯是有自己的收发控制,我该在什么时间进行数据处理?我现在想的是接收ADC后置标志,标志为1处理ADC,但是担心这样会导致时间问题

您好,您是使用AUTO还是BASIC模式的RF收发。

如果是AUTO模式,原发送方发完后会自动切换开启一段接收窗口,超时或收到回包后结束本次发包;为了保证原发送方在接收窗口内及时收到原接收方的回包,原接收方RF_Rx函数的第一个参数是预先填写的回包,并不是收到包后原样回传,这样原接收方在收到包后不用处理数据,自动切换成发送模式直接回包,回完包再自动切换成接收模式继续等待收包。这样会导致“落后一个命令”的现象。如果期望AUTO模式下及时回传处理的数据,原接收方在第一次自动回包后及时处理数据,处理后填写到RF_Rx函数中,等待第二次自动回包时返回数据;原发送方再次发送一包数据,获取刚刚处理好的数据回包。

如果使用BASIC模式,不会有上述问题,收发都是按用户逻辑切换的。发送方只由RF_Tx函数的第一个参数决定负载数据;接收方RF_Rx函数的第一个参数不再生效;接收方回包需要手动切换成发送方,在调用RF_Tx函数回包。


问题是我使用BASIC模式的RF收发出现了延迟问题,我该怎么控制收发逻辑?

我现在代码是发送端使用串口中断接收上位机命令后开启发送信息事件,然后接受端发送数据回来,发送端再接受到数据后进行处理并输出。

现在根据打印信息,每次都是收到了回传信息的,但是发送端发送信息事件后直接先输出了数据,明明事件的代码在前面但是事件后执行。图片.png整体的数据每次都是先输出后处理,导致数据全都落后一个命令。

下面是部分代码:

tmos_set_event(taskID,?SBP_RF_COMMAND_EVT);?//发送事件
ADC=ADC_put(&example);?????//数据处理
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);?//输出数据
tmos_set_event(taskID,?SBP_RF_COMMAND_EVT);?//发送事件

这行代码执行后事件会立刻执行吗?


您好,处于接收模式时,可以在case RX_MODE_RX_DATA: 分支中,确定收到包并处理好数据之后,再启用一个TMOS事件去切换到发送模式;处于发送模式时,可以在case TX_MODE_TX_FINISH:分支中,再启用一个TMOS事件去切换到接收模式。

调用tmos_set_event安排事件,下一次主循环查询事件标志时,该事件就已经置位了,不过同一个taskID下同时置位的事件,先后执行顺序要看ProcessEvent函数中该事件ID的处理if分支时写在前面还是后面。


只有登录才能回复,可以选择微信账号登录