具体程序如下
char theMessageData[] = {CircleCount,uartnumber,UART_ADDR_buffer};
//发送函数
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_LOC_EQP_CUR,
( byte )osal_strlen ( theMessageData ) + 1,
( byte *)&theMessageData,
&SampleApp_TransID,
AF_ACK_REQUEST,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
if(SAMPLEAPP_LOC_EQP_CUR==SAMPLEAPP_LOC_EQP_LAST)
{
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_DUO1_EVT,
20 );
}
}
我想实现的是在这个模块发送完成后20ms后切换信道,这个SAMPLEAPP_DUO1_EVT事件里就是一个切换信道的函数,但结果是他很多时候都是先切换信道再发送(当然也有先发送成功的),就导致其他模块收不到他发送的消息,我也想过收到应答后再切换,在 case AF_DATA_CONFIRM_CMD:里切换,同样的他还是会先切换信道,很是苦恼,而且我的项目要求这个速度,也就是时间间隔不能长。我想知道是不是cc2531的硬件有瓶颈,是不是切换信道是瞬间,但软件判定发送成功到硬件实现发送成功所需的时间很不确定,可能需要很长时间,大几十ms,如果真是这样工程师们有没有什么好的建议让这个模块确保硬件上发送成功后再切换信道。小弟在此多谢了。。。
VV:
你切换信道在哪里操作的
chao sun2:
回复 VV:
报告工程师,
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_DUO1_EVT,20 );这个20ms后的事件内便是切换信道的函数,这个函数式确定发送成功后20ms后设置的事件,实际情况却是每次却是先切换信道才发送信息。。
VV:
回复 chao sun2:
原因是信道操作是通过修改寄存器直接可以实现的,相当于立即生效。
但是发送数据来说,虽然AF_DataReqeust返回的是成功,但是这个成功并不是无线发送成功了,而是成功的把数据加入到了底层发送的队列里面,实际发送需要等到底层调度到以后才能发送数据的。