📄 uart.c
字号:
/********************************************************************************************************
** 功能描述: 串口中断,
** 日 期:
********************************************************************************************************/
#include"stc89c51rc.h"
#include " uart.h"
#include <intrins.h>
int rCOMM_TOTAL1 ; //有效接收数据个数
uchar ucUart_buffer[BUFFER_NUM][16];
xdata uchar ucUart_buffer_data[16];
uchar ucDatabuf[3]; //接收缓冲
idata uchar ucUart_rd = 0;
uchar ucUart_wr = 0;
uchar ucUart_buffer_pv = 0;
uchar ucState=0; //接收状态
uchar ucReceDataNum=0; //有效接收个数
uchar ucReceVeryfy; //校验累加和变量
uchar ucSendVeryfy;
uchar ucReceData[16]; //read data
uchar ucSendData[16]; //send data
uchar ucSendDataNum=0; //已发送字节数
//uchar STATE=0; //接收状态
bit uart_sBIT; //发送完成标志
bit uart_rBIT; //接收标志
//-------------------------------------------------------
//-------------------串口,跟6410通信--------------------
void MAIN_RS_INT(void) interrupt 4
{
uchar DataTemp;
if(RI) // 接收
{
RI = 0;
if( ucUart_buffer_pv >= BUFFER_NUM ) return;
DataTemp = SBUF;
switch(ucState)
{
case ucState_START: //开始位 0
{
if(START == DataTemp)
{
ucReceDataNum = 0;
ucReceVeryfy = 0;
ucState = ucState_DATA1;
}
break;
}
case ucState_DATA1: //数据长度位
{
ucDatabuf[ucReceDataNum++] = DataTemp;
if(ucReceDataNum == 3)
{
if(ucDatabuf[2] == ucReceVeryfy)
{
ucState = ucState_DATA2;
ucReceVeryfy = 0;
ucReceDataNum = 0;
rCOMM_TOTAL1 = ucDatabuf[ 0 ];
rCOMM_TOTAL1 = (rCOMM_TOTAL1<<8) + ucDatabuf[1] ;
}
else
{
ucState = ucState_START;
ucReceDataNum = 0;
ucReceVeryfy =0;
}
}
else
{
ucReceVeryfy += DataTemp;
}
break;
}
case ucState_DATA2: //数据位 2
{
ucUart_buffer_data[ucReceDataNum++] = DataTemp;
if( ucReceDataNum == rCOMM_TOTAL1+1 )
{
if( ucUart_buffer_data[ ucDatabuf[2] ] == ucReceVeryfy ) //判断校检和
{
ucState = ucState_END;
}
else
{
ucState = ucState_START;
ucReceDataNum = 0;
ucReceVeryfy =0;
}
}
else if( ucReceDataNum > rCOMM_TOTAL1+1 )
{
ucState = ucState_END;
}
else
{
ucReceVeryfy += DataTemp; //计算校检和
}
break;
}
case ucState_END: //结束位 3
{
if(END == DataTemp)
{
uchar i;
for( i=0; i< rCOMM_TOTAL1; i++ )
{
ucUart_buffer[ucUart_wr][i] = ucUart_buffer_data[i];
}
ucUart_wr ++;
if( ucUart_wr >= BUFFER_NUM ) ucUart_wr = 0;
ucUart_buffer_pv ++;
}
ucState = ucState_START;
break;
}
default:
{
ucState = ucState_START;
break;
}
}
}
if(TI)
{
TI = 0;
ucSendDataNum++;
if(ucSendDataNum < ucSendData[3]+6)
{
SBUF = ucSendData[ucSendDataNum];
}
else
{
uart_sBIT = 1;
}
}
}
/*********************************************************************************************************
** 功能描述:
** 日 期:
*********************************************************************************************************/
bit send_dis_data(uchar Data1,uchar Data2,uchar *SendDeatBuf3) //转发可变协议
{
uchar i;
uint Data3;
ucSendData[0]=START;
ucSendData[1]=Data1;
ucSendData[2]=Data2;
ucSendData[3]= ucSendData[1] + ucSendData[2];
Data3 = Data1;
Data3 = (Data3<<8) + Data2;
ucSendVeryfy = 0;
for( i=0;i< Data3 ;i++)
{
ucSendVeryfy += *(SendDeatBuf3);
ucSendData[4 + i] = *(SendDeatBuf3++);
}
ucSendData[ 4 + Data3 ]= ucSendVeryfy ;
ucSendData[ 5 + Data3 ]= END;
uart_sBIT = 0;
ucSendDataNum = 0;
EX1 = 0;
SBUF = ucSendData[0];
while(!uart_sBIT);
EX1 = 1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -