目录
 
前言
 
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队列句柄。 然后分时间片给这个任务时,去读取这个队列中是否有有效数据,如果有有效数据,就依次读取和校验。