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

📄 rxdata.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
字号:
/*
*********************************************************************************************************
*                                              Microchip PIC24FJ
*                                            Board Support Package
*
*                                                   Micrium
*                                    (c) Copyright 2005, Micrium, Weston, FL
*                                              All Rights Reserved
*
*
* File : MassInt.C
* By   : //tbh080522
*********************************************************************************************************
*/
#include <includes.h>

//#ifndef RX_DATA
//
//typedef unsigned char     INT8U;
//
////定义环境相关标识符,在不同的项目或硬件环境中需要设置与环境一致的内容
////#define SW_SOFT_CLEAR_RCIF    //如果MCU需要软件清除字节接收中断标识位(如具有8051核的MCU),则须定义該開關
//#define SW_SOFT_CLEAR_OERR    //如果MCU需要软件清除接收缓冲器溢出错误状态位(如具有PIC核的MCU),则须定义該開關
//#define CNT_RECV_MAX_NUM            30    //封包接收最大字節數
//#define CNT_RECV_START_BYTE         ':'    //封包起始字节
//#define CNT_RECV_END_BYTE           '\r'   //封包終止字节
//#define CNT_RX_ERR_JUDGE_TIME       2000      //通訊失敗判斷延时门限(ms)
//#endif

#define BIT_RXD_OVER_FLAG           _OERR   //字节接收溢出标识位
#define PIN_RXD_OVER_NOTE           _RF13   //字节接收溢出指示管腳
#define BIT_RXD_INT_FLAG            _U1RXIF   //字节接收中断标识位
//初始化全局变量(这些变量可以被外部访问,但需要在使用它们的文件中加extern声明)

INT8U RecvBuf[CNT_RECV_MAX_NUM];//=":025C025A123A105bc79\r";         //数据接收缓存区
INT8U RecvByteCnt             =0xFF;     //接收字节计数,初始化為無效.只有接收到起始字節清0後有效

//===================================================================
//函数功能        :数据接收中断处理进程,专用于在串口接收中断处理程序中调用   
//===================================================================
void RecvServer(INT8U rxd_byte)
{
    
    //如果MCU不能硬件清除字节接收中断标识位,则需要进行软件清除
#ifdef SW_SOFT_CLEAR_RCIF
    BIT_RXD_INT_FLAG=0;
#endif

#ifdef SW_SOFT_CLEAR_OERR
    if(BIT_RXD_OVER_FLAG==1)
    {
	    PIN_RXD_OVER_NOTE=1;
        BIT_RXD_OVER_FLAG=0;
    }
#endif
    
    //当接收到起始字節,复位接收字節指針
    if(rxd_byte==CNT_RECV_START_BYTE)
    {
        RecvBuf[0]=rxd_byte;
        RecvByteCnt=0x01;//啟動接收有效數據
    }
    //緩存有效數據(HEX ASCLL編碼)
    else if(
    	      (RecvByteCnt<CNT_RECV_MAX_NUM-2)
    	      &&(
    	          ((rxd_byte>='0')&&(rxd_byte<='9'))
    	          ||((rxd_byte>='A')&&(rxd_byte<='F'))
    	          ||((rxd_byte>='a')&&(rxd_byte<='f'))
    	          ||(rxd_byte==CNT_RECV_END_BYTE)
    	      )
    	    )
    {
        RecvBuf[RecvByteCnt++]=rxd_byte;
        //当接收到終止字節,或指令數據過長时,設置接收字節指針無效以停止數據緩存
        if(rxd_byte==CNT_RECV_END_BYTE)
        {
            RecvByteCnt=0xFF;//忽略無效數據
            OSMboxPost(MboxRx_Finish,RecvBuf);
        }
    }
    else if((rxd_byte!='\n')&&(rxd_byte!='\r'))//若為單純的回車或換行,則忽略
    {
        RecvByteCnt=0xFF;//
        OSMboxPost(MboxRx_Finish,(void*)2);//通知其它任務數據接收無效
    }
    
}//函数RecvServer结束

⌨️ 快捷键说明

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