📄 serial.c
字号:
/*----------------------------------------------------------------------------
名 称:serial.c
功 能:aduc848串口相关函数的实现
版 本:0.1
负责人:邓健
历 史:
2007.7.11 created by Jiandeng
----------------------------------------------------------------------------*/
#include<aduc845.h>
#define RX_IDL 0
#define RX_HDR 1
#define RX_ADD 2
#define RX_CMD 3
#define RX_LEN 4
#define RX_DAT 5
#define RX_CHK 6
#define RX_X16 7
#define RX_END 255
unsigned char xdata serialRxData[20];
unsigned char xdata serialTxData[2500];
unsigned int serialTxLEN;
unsigned char serialRxADD,serialRxCMD,serialRxLEN;
unsigned char serialRxStatus = RX_IDL;
extern unsigned char ADDR;
/**********************************************************
串口初始化,波特率设置为115200,使能中断
***********************************************************/
void SerialInit(void)
{
T3CON = 0x82; //115200 Baud rate
T3FD = 0x2D;
SCON = 0x52;
ES=1; //Enable interrupt
}
/**********************************************************
串口发送,把发送缓冲区里的数据通过串口发送出去
***********************************************************/
void SerialTx(unsigned int len)
{
serialTxLEN = len;
SBUF = 0xFE;
}
/**********************************************************
串口发送
【add】 从机地址
【cmd】 命令
【len】 数据长度
待发送的数据保存在serialTxData[10]开始先
***********************************************************/
void SerialSend(unsigned char add,unsigned char cmd,unsigned int len)
{
unsigned char serialTxCHK = 0;
unsigned int i;
serialTxData[0] = 0xFE;
serialTxData[1] = 0x68;
serialTxData[2] = add;
serialTxData[3] = add;
serialTxData[4] = cmd;
serialTxData[5] = cmd;
serialTxData[6] = len>>8;
serialTxData[7] = len;
serialTxData[8] = len>>8;
serialTxData[9] = len;
for(i = 10;i < 10 + len;i ++) //checksum
{
serialTxCHK += serialTxData[i];
}
serialTxData[10 + len] = serialTxCHK;
serialTxData[11 + len] = 0x16;
SerialTx(12 + len);
}
/**********************************************************
串口中断函数
***********************************************************/
void int_serial() interrupt 4
{
static unsigned char serialRxCounter,serialRxCHK;
static unsigned int serialTxCounter;
if(1 == RI)
{
RI = 0;
switch(serialRxStatus)
{
case RX_IDL: //空闲状态,接收0xFE进入HDR状态
if(SBUF == 0xFE)
{
serialRxStatus = RX_HDR;break;
} //HDR状态,接收0x68开始接收地址,接收到0xFE则保持HDR状态
case RX_HDR:
if(SBUF == 0x68)
{
serialRxStatus = RX_ADD;
}
else if(SBUF != 0xFE)
{
serialRxStatus = RX_IDL;
}
break;
case RX_ADD: //ADD状态,接收1B的地址,重复发送两次,接收成功则进入CMD状态
if(serialRxCounter == 0)
{
serialRxADD = SBUF;
serialRxCounter = 1;
}
else
{
serialRxCounter = 0;
if(SBUF == serialRxADD && serialRxADD == ADDR)
{
serialRxStatus = RX_CMD;
}
else
{
serialRxStatus = RX_IDL;
}
}
break;
case RX_CMD: //CMD状态,1B命令,重复发送两次,接收成功则进入LEN状态
if(serialRxCounter == 0)
{
serialRxCMD = SBUF;
serialRxCounter = 1;
}
else
{
serialRxCounter = 0;
if(SBUF == serialRxCMD)
{
serialRxStatus = RX_LEN;
}
else
{
serialRxStatus = RX_IDL;
}
}
break;
case RX_LEN: //LEN状态,接收2B数据长度,重复两次,这里只考虑了低字节,接收成功进入DAT或者CHK状态
if(serialRxCounter == 0)
{
serialRxCounter = 1;
}
else if(serialRxCounter == 1)
{
serialRxLEN = SBUF;
serialRxCounter = 2;
}
else if(serialRxCounter == 2)
{
serialRxCounter = 3;
}
else
{
serialRxCounter = 0;
if(SBUF == serialRxLEN)
{
serialRxCHK = 0;
if(serialRxLEN == 0)
{
serialRxStatus = RX_CHK;
}
else
{
serialRxStatus = RX_DAT;
}
}
else
{
serialRxStatus = RX_IDL;
}
}
break;
case RX_DAT: //DAT状态,接收数据,接收完了进入CHK状态
if(serialRxCounter < serialRxLEN)
{
serialRxData[serialRxCounter++] = SBUF;serialRxCHK += SBUF;
}
if(serialRxCounter == serialRxLEN)
{
serialRxCounter = 0;
serialRxStatus = RX_CHK;
}
break;
case RX_CHK: //CHK状态,接收校验和
if(SBUF == serialRxCHK)
{
serialRxStatus = RX_X16;
}
else
{
serialRxStatus = RX_IDL;
}
break;
case RX_X16: //X16状态,接收结束标志0x16 ,接收成功进入END状态
if(SBUF == 0x16)
{
serialRxStatus = RX_END;
}
else
{
serialRxStatus = RX_IDL;
}
break;
case RX_END:
break;
default:
serialRxStatus = RX_IDL;break;
}
}
if(1 == TI)
{
TI=0;
if(serialTxCounter < serialTxLEN)
{
SBUF=serialTxData[serialTxCounter++];
}
if(serialTxCounter == serialTxLEN)
{
serialTxLEN = 0;
serialTxCounter = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -