目录
前言
xTaskCreate(radiolinkTask, “RADIOLINK“, 150, NULL, 5, NULL); /*创建无线连接任务*/
一、radiolinkTask()
void radiolinkTask(void *param)
{
rxState = waitForStartByte1;
u8 c; /*ÎÞ·ûºÅ×Ö·ûÀàÐÍ*/
u8 dataIndex = 0;
u8 cksum = 0;
while(1)
{
if (uartslkGetDataWithTimout(&c)) /*这里是每次接受一个字节的数据,这里进去函数读取uartslkDataDelivery队列句柄是否有数据,如果有数据就拷贝到&c所在地址中,如果没数据*c=0 */
{
switch(rxState)
{
case waitForStartByte1:
rxState = (c == DOWN_BYTE1) ? waitForStartByte2:waitForStartByte1;
cksum = c;
break;
case waitForStartByte2:
rxState = (c == DOWN_BYTE2) ? waitForMsgID : waitForStartByte1;
cksum += c;
break;
case waitForMsgID:
rxPacket.msgID = c;
rxState = waitForDataLength;
cksum += c;
break;
case waitForDataLength:
if (c <= ATKP_MAX_DATA_SIZE)
{
rxPacket.dataLen = c;
dataIndex = 0;
rxState = (c > 0) ? waitForData : waitForChksum1; /*c=0,Êý¾Ý³¤¶ÈΪ0£¬Ð£Ñé1*//**/
cksum += c;
} else
{
rxState = waitForStartByte1;
}
break;
case waitForData:
rxPacket.data[dataIndex] = c;
dataIndex++;
cksum += c;
if (dataIndex == rxPacket.dataLen)
{
rxState = waitForChksum1;
}
break;
case waitForChksum1:
if (cksum == c)
{
atkpPacketDispatch(&rxPacket);
}
else
{
rxState = waitForStartByte1;
IF_DEBUG_ASSERT(1);
}
rxState = waitForStartByte1;
break;
default:
ASSERT(0);
break;
}
}
else
{
rxState = waitForStartByte1;
}
}
}
bool uartslkGetDataWithTimout(u8 *c)
bool uartslkGetDataWithTimout(u8 *c)
{
/*接受uartsls队列句柄的数据*/
if (xQueueReceive(uartslkDataDelivery, c, UARTSLK_DATA_TIMEOUT_TICKS) == pdTRUE)
{
return true;
}
*c = 0;
return false;
}
总结
主要是在radiolink初始化的时候定义了一个 uarts队列句柄。 然后分时间片给这个任务时,去读取这个队列中是否有有效数据,如果有有效数据,就依次读取和校验。