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

📄 uart0.c

📁 基于电力载波芯片3106开发的,在载波和485之间互相转换
💻 C
字号:
#define UART0_GLOBALS



#include "includes.h"



/****************************本地变量定义*************************/
static idata INT8U  UART0_ByteCnt;
static idata INT8U  UART0_RcvByte;
             Com    UART0_Com;



/****************************本地变量定义*************************/
static void UART0_Tx (void);
static void UART0_Rx (void);



/****************************全局函数*****************************/
UART0_EXT void UART0_ParaInit (void)
/*===============================================
    函数名:    UART0_ParaInit
    功能  :    串口0参数初始化
    输入  :    无
    输出  :    无
===============================================*/
{
    UART0_ByteCnt  = 0;
    UART0_RcvByte  = 0;
    UART0_MaxLen   = 0;
    UART0_SendFlag = 0;
}



UART0_EXT void UART0_Course (void)
/*===============================================
    函数名  :    UART0_Course
    功能    :    串口发送数据
    输入    :    无 
    输出    :    无 
===============================================*/
{
    if (UART0_SendFlag){
        UART0_SendFlag = 0;

        UART0_ByteCnt  = 0;
		
        TI = 1;                   /*强制进入发送*/
    }
}



/****************************本地函数*****************************/
void UART0_Int (void) interrupt 4
/*===============================================
    函数名  :    UART0_Int
    功能    :    串口中断
    输入    :    无
    输出    :    无
===============================================*/
{
    if (RI){                      /*接收*/
        RI            = 0;

        LED_485       = 0;        /*开串口接收指示灯*/
        UART0_RcvByte = SBUF0;

        UART0_Rx();
    }else if (TI){                /*发送*/
        TI            = 0;

        LED_485       = 0;        /*开串口发送指示灯*/

        UART0_Tx();
    }
}



static void UART0_Tx (void)
/*==============================================
    函数名:    UART0_Tx
    功能  :    串口发送
    输入  :    无
    输出  :	   无
===============================================*/
{
    INT8U i;
    bit   vfybit;

    if (UART0_ByteCnt < UART0_MaxLen){

        for (i=0x80; i!=0; i>>=1){
            if ((COM_DatBuf[UART0_ByteCnt] & i) != 0){
                vfybit ^= 1;
            }
        }
        TB8 = vfybit;
        vfybit = 0;

        SBUF0 = COM_DatBuf[UART0_ByteCnt ++];

    }else{                     /*发送完毕*/

        LED_485       = 1;     /*关串口发送指示灯*/

        UART0_ByteCnt = 0;
        UART0_MaxLen  = 0;
    }
}



static void UART0_Rx (void)
/*===============================================
    函数名:    UART0_Rx
    功能  :    串口接收
    输入  :    无
    输出  :    无
===============================================*/
{
    switch (UART0_Com.RxPhase){

        case 0:/*第一起始符*/
            if (0xfe == UART0_RcvByte){
                UART0_Com.RxPhase = 0;
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
            }else if (0x68 == UART0_RcvByte){
                UART0_Com.RxPhase           = 2;
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
            }else if ((0x14 == UART0_RcvByte)||(0x24 == UART0_RcvByte)||(0x16 == UART0_RcvByte)||(0x10 == UART0_RcvByte)){
                UART0_Com.RxPhase           = 1;
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
            }else{
                UART0_Com.RxErr             = 1;
            }
            break;

        case 1:/*浩迪规约第二起始符*/
            if ((0x11 == UART0_RcvByte)||(0xee == UART0_RcvByte)){
                UART0_Com.RxPhase           = 2;
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
            }else{
                UART0_Com.RxErr             = 1;
            }
            break;

        case 2:/*地址域*/
            COM_DatBuf[UART0_MaxLen ++]     = UART0_RcvByte;
            UART0_Com.AdrLenCnt ++;
            if (6 == UART0_Com.AdrLenCnt){
                UART0_Com.AdrLenCnt         = 0;
                UART0_Com.RxPhase           = 3;
            }else if (UART0_Com.AdrLenCnt > 6){/*为了防止不可预知的错误*/
                UART0_Com.RxErr             = 1;
            }
            break;

        case 3:/*数据起始符*/
            if (0x68 == UART0_RcvByte){
                UART0_Com.RxPhase           = 4;
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
            }else if (0xaa == UART0_RcvByte){
                UART0_Com.RxPhase           = 4;
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
            }else{
                UART0_Com.RxErr             = 1;
            }
            break;

        case 4:/*控制码*/
            COM_DatBuf[UART0_MaxLen ++]     = UART0_RcvByte;
            UART0_Com.RxPhase               = 5;
            break;

        case 5:/*数据长度*/
            if (30 > UART0_RcvByte){/*最长数据为20个字节*/
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
                UART0_Com.RxDatLen          = UART0_RcvByte;
                UART0_Com.RxPhase           = 6;
            }else{
                UART0_Com.RxErr             = 1;
            }
            break;

        case 6:/*数据域*/
            COM_DatBuf[UART0_MaxLen ++]     = UART0_RcvByte;
            UART0_Com.DatLenCnt ++;
            if (UART0_Com.DatLenCnt == UART0_Com.RxDatLen){
                UART0_Com.RxPhase           = 7;
                UART0_Com.DatLenCnt         = 0;
                UART0_Com.RxDatLen          = 0;
            }else if (UART0_Com.DatLenCnt > UART0_Com.RxDatLen){/*为了防止不可预知的错误*/
                UART0_Com.RxErr             = 1;
            }
            break;

        case 7:/*校验码*/
            COM_DatBuf[UART0_MaxLen ++]     = UART0_RcvByte;
            UART0_Com.RxPhase               = 8;
            break;

        case 8:/*结束符*/
            if (0x16 == UART0_RcvByte){
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
                UART0_Com.RxPhase           = 0;

                ZB_SendFlag                 = 1;
                ZB_MaxLen                   = UART0_MaxLen;
                UART0_MaxLen                = 0;

                LED_485                     = 1;

                RS485_Tx                    = 1;
            }else if (0xff == UART0_RcvByte){
                COM_DatBuf[UART0_MaxLen ++] = UART0_RcvByte;
                UART0_Com.RxPhase           = 9;
            }else{
                UART0_Com.RxErr             = 1;
            }
            break;

        case 9:/*浩迪CRC校验*/
            COM_DatBuf[UART0_MaxLen ++]     = UART0_RcvByte;
	        UART0_Com.CrcLenCnt ++;
            if (UART0_Com.CrcLenCnt == 2){
                UART0_Com.RxPhase           = 0;
                UART0_Com.CrcLenCnt         = 0;

                ZB_SendFlag                 = 1;
                ZB_MaxLen                   = UART0_MaxLen;
                UART0_MaxLen                = 0;

                LED_485                     = 1;/*关指示灯*/

                RS485_Tx                    = 1;/*转为接收*/
            }else if (UART0_Com.CrcLenCnt > 2){/*为了防止不可预知的错误*/
                UART0_Com.RxErr             = 1;
            }
            break;

        default:
            break;
	}

    if (UART0_Com.RxErr){/*如果帧接收有错误*/
        UART0_Com.RxErr      = 0;
        UART0_Com.RxPhase    = 0;
        UART0_Com.RxDatLen   = 0;
        UART0_Com.DatLenCnt  = 0;
        UART0_Com.CrcLenCnt  = 0;
        UART0_Com.AdrLenCnt  = 0;

        UART0_MaxLen         = 0;

        LED_485              = 1;/*关指示灯*/

        RS485_Tx             = 1;/*转为接收*/
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -