📄 taskuart.c
字号:
#define _TASK_UART0_H_
#include "config.h"
#define BUF_LEN 32
//串口接收处理,完成帧数据完整性的分析
void TaskUart0Receive(void *pdata)
{
uint8 Uart0Buf[BUF_LEN];
uint8 Uart0Status;
uint8 Uart0Point;
uint8 Uart0Temp;
pdata = pdata;
Uart0Status = 0;
Uart0Point = 0;
while(1)
{
switch( Uart0Status )
{
case 0: //收到起始位
if( UART0Getch() == 0x3a )
{
Uart0Status = 1;
}
break;
case 1:
Uart0Temp = UART0Getch();
if( Uart0Temp == 0x3a )
{ //再次收到起始位
Uart0Point = 0;
}
else
{
Uart0Buf[Uart0Point] = Uart0Temp;
Uart0Point++;
Uart0Point%=20;
if( (Uart0Buf[Uart0Point-1] == 0x0a) && (Uart0Buf[Uart0Point-2])==0x0d )
{ //收到完整的一帧数据
Uart0Point = 0;
Uart0Status = 0;
OSMboxPost(Uart0ReceiveMbox, Uart0Buf); //发送邮箱消息
}
}
break;
default:
Uart0Point = 0;
Uart0Status = 0;
break;
}
}
}
//协议的解析处理
void TaskUart0Process(void *pdata)
{
uint8 err;
uint8 *BufPtr;
uint8 Buf[20];
uint8 temp;
pdata = pdata;
BufPtr = Buf;
while(1)
{
BufPtr = (uint8 *)OSMboxPend(Uart0ReceiveMbox,0,&err); //等待完整的一帧数据
temp = strlen((char *)BufPtr);
AscToHex(BufPtr,temp);
if( temp == 6 )
{
if( (*BufPtr) == 0x01 )
{
if( (*(BufPtr+1)) == 0x01 )
{
UART0Write(BufPtr,6);
}
}
}
OSTimeDly(1);
}
}
/****************************************************************************
* 名称:AscToHex
* 功能:将ASC数据变换成HEX数据
* 入口参数:*u8Ptr 需要转换的缓冲区首地址
u8Len 需要转换的ASC字节数量
* 出口参数:无
****************************************************************************/
void AscToHex(uint8 *u8Ptr,uint8 u8Len)
{
uint8 i,j,x,y;
for(i=0,j=0;i<u8Len;i++,j++) //2个ASC码变成1个char型,所以i移动2次而j移动1次
{
x = *(u8Ptr+i);
if( (x <= '9') && (x >= '0') )
{
x = x -'0';
}
else
{
if( (x <= 'F') && (x >= 'A') )
{
x = x - 'A' + 10;
}
else
{
if( (x <= 'f') && (x >= 'a') )
{
x = x - 'a' + 10;
}
}
}
i++;
y = *(u8Ptr+i);
if( (y <= '9') && (y >= '0') )
{
y = y -'0';
}
else
{
if( (y <= 'F') && (y >= 'A') )
{
y = y - 'A' + 10;
}
else
{
if( (y <= 'f') && (y >= 'a') )
{
y = y - 'a' + 10;
}
}
}
*(u8Ptr+j) = x*16 + y;
}
}
/****************************************************************************
* 名称:HexToAsc
* 功能:将hex数据变换成asc数据
* 入口参数:*u8Ptr 需要转换的缓冲区首地址
u8Len 需要转换的hex字节数量
* 出口参数:无
****************************************************************************/
void HexToAsc(uint8 *u8Ptr,uint8 u8Len)
{
uint8 i,x,y;
for(i=u8Len;i>0;i--)
{
x = *(u8Ptr+i-1)/16; //高半字节
if(x < 10)
{
x = x+'0';
}
else
{
x = x+'A'-10;
}
y = *(u8Ptr+i-1) & 0x0f; //低半字节
if(y < 10)
{
y = y+'0';
}
else
{
y = y+'A'-10;
}
*(u8Ptr+i*2-2) = x;
*(u8Ptr+i*2-1) = y;
}
//for循环结束后i=0,所以下面用u8Len作为指针
*(u8Ptr+u8Len*2) = 0x0d;
*(u8Ptr+u8Len*2+1) = 0x0a;
}
/****************************************************************************
* 名称:LRC8()
* 功能:计算LRC结果
* 入口参数:*u8Msg 需要校验的缓冲区首地址
* u8DataLen 需要校验的数据长度
* 出口参数:校验和
****************************************************************************/
uint8 LRC8(uint8 *u8Msg,uint8 u8DataLen)
{
uint8 uchLRC = 0; //LRC字节初始化
while(u8DataLen--)
{
uchLRC += *u8Msg++; //累加
}
return( (uint8)(-((char)uchLRC)) );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -