📄 rxdata.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 + -