目录
前言
xTaskCreate(usblinkRxTask, "USBLINK_RX", 150, NULL, 4, NULL); /*USB接受任务*/
xTaskCreate(usblinkTxTask, "USBLINK_TX", 150, NULL, 3, NULL); /*USB发送任务*/
一、xTaskCreate(usblinkRxTask,..)
1.
void usblinkRxTask(void *param)
{
u8 c;
u8 dataIndex = 0;
u8 cksum = 0;
rxState = waitForStartByte1;
while(1)
{
if (usbGetDataWithTimout(&c))
{
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) /*ËùÓÐУÑéÕýÈ·*/
{
ledseqRun(DATA_RX_LED, seq_linkup);
atkpReceivePacketBlocking(&rxPacket);
}
else /*УÑé´íÎó*/
{
rxState = waitForStartByte1;
IF_DEBUG_ASSERT(1);
}
rxState = waitForStartByte1;
break;
default:
ASSERT(0);
break;
}
}
else /*³¬Ê±´¦Àí*/
{
rxState = waitForStartByte1;
}
}
}
2.void usblinkTxTask(void *param)
void usblinkTxTask(void *param)
{
atkp_t p;//定义了要发送的数据包格式
u8 sendBuffer[64]; //这是需要发送的数据
u8 cksum;
u8 dataLen;
while(1)
{
xQueueReceive(txQueue, &p, portMAX_DELAY); //这是创建的发送队列 数据格式为 atkp_t
sendBuffer[0] = UP_BYTE1;
sendBuffer[1] = UP_BYTE2;
sendBuffer[2] = p.msgID;
sendBuffer[3] = p.dataLen;
memcpy(&sendBuffer[4], p.data, p.dataLen);//memcpy 源地址 目的地 数据长度
//意思就是说sendBuffer里面定义类似atkp_t 一样的数据格式
//先把 0xAA 0xAA ID Len 从[4]开始拷贝传入的txQueue里面的Len长度的数据
cksum = 0;
for (int i = 0; i < p.dataLen+4; i++)
{
cksum += sendBuffer[i];//这里是求取所有的数据值的代数和
}
dataLen = p.dataLen + 5;
sendBuffer[dataLen - 1] = cksum; //所有数据值的代数和 可能是用于校验
usbsendData(sendBuffer, dataLen);//usb 发送
ledseqRun(DATA_TX_LED, seq_linkup);
}
}
总结
在usb 初始化的时候定义了txQueue 和 usbDataDelivery队列句柄
txQueue已经定义好了上行还是下行 ID Len 这里是将数据读出 并传给sendBuffer 并 加入校验字 通过usb发送