(2/10;3/10)xTaskCreate(usblinkRxTask, “..“, 150, NULL, 4, NULL);usblinkTxTask();/*usb接受及发送任务*/

目录


前言

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值