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