(210;310)xTaskCreate(usblinkRxTask, “..“, 150, NULL, 4, NULL);usblinkTxTask();*usb接受及发送任务*

it2025-10-08  3

目录


前言

    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发送

 

最新回复(0)