⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taskuart.c

📁 UCOS_UCGUI_MDK_LPC2134的移植代码.rar
💻 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 + -