第5个任务,解析处理接收到的指令
xTaskCreate(atkpRxAnlTask, "ATKP_RX_ANL", 300, NULL, 6, NULL);
上面第1个任务,把串口接收到的数据解包后得到指令,然后把指令发送到队列rxQueue里了,该任务就是从队列里取指令,然后分析处理。
一、执行串口指令任务
void atkpRxAnlTask(void *param)
{
atkp_t p;
while(1)
{
xQueueReceive(rxQueue, &p, portMAX_DELAY);
atkpReceiveAnl(&p);
}
}
这个任务相当简洁,它的优先级定义为6,比上面解包串口数据的任务优先级(5)高。也就是优先级5的任务1解包之后,解出来的指令存入到rxQueue队列,任务1就被挂起了。先执行这个更高优先级的任务,如果指令是请求数据的。该任务就把数据入队txQueue,执行完后返回到任务1,任务1继续执行,从txQueue取数据发送到串口DMA。
任务从队列读取一条指令,复制到变量p里,然后调用函数分析指令
二、处理指令
处理指令的函数结构如下,这个有点复杂,原理就是根据指令的msgID作出不同的响应
static void atkpReceiveAnl(atkp_t *anlPacket)
{
if(anlPacket->msgID == DOWN_COMMAND)
{
switch(anlPacket->data[0])
{
//..根据第1个数据,改变标志flyable,该标志在atkpSendPeriod函数被调用
}
}
else if(anlPacket->msgID == DOWN_ACK)
{
if(anlPacket->data[0] == D_ACK_READ_PID)
{
//....如果请求PID参数,则把PID参数封装成包放入无线txQueue队列,如果USB连接了,同样把参数发送到USB的txQueue队列
}
if(anlPacket->data[0] == D_ACK_RESET_PARAM)//恢复默认参数
{
//.....恢复参数后,重新设置PID,然后把参数入队,发送给遥控器
}
}
else if(anlPacket->msgID == DOWN_RCDATA)
{//如果指令发来的是RC数据,把它存到变量rcdata 中
rcdata = *((joystickFlyui16_t*)anlPacket->data);
}
else if(anlPacket->msgID == DOWN_POWER)/*nrf51822*/
{
pmSyslinkUpdate(anlPacket);
}
else if(anlPacket->msgID == DOWN_REMOTER)
{
remoterCtrlProcess(anlPacket);
}
else if(anlPacket->msgID == DOWN_PID1)
{
//....如果接收到的是PID数据,把它存到变量pidRateRoll中,并返回ID和校验和
}
else if(anlPacket->msgID == DOWN_PID2)
{
//.....
}
else if(anlPacket->msgID == DOWN_PID3)
{
//.....
}
else if(anlPacket->msgID == DOWN_PID4)
{
//.....
}
else if(anlPacket->msgID == DOWN_PID5)
{
//.....
}
else if(anlPacket->msgID == DOWN_PID6)
{
//....设置PWM
}
}
这里只是把接收到的指令,存到了相应的变量中。等待其它任务去调用这些变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)