📄 uart.c
字号:
#include <reg52.h>
#include <intrins.h>
#define TRUE 1
#define FALSE 0
#define TRANSMAX 12 //发送缓冲区的长度
#define RECNUM 64 //接受数组的长度
#define RESENDNUM 3 //先定义重发次数为3次
unsigned char xdata outbuff[TRANSMAX]; //发送缓冲区
unsigned char out_num; //待发送的数据长度
unsigned char out_ptr; //发送数据的指针
unsigned long int xdata ad_out; //读出的内码
extern bit in_send; //正在发送数据标志
extern bit r_succes_b; //成功接受一个字符的标志
extern bit pick;
extern bit stab;
extern bit bat_crane;
extern bit BRecData; //接收端已接收到数据(长度>=7个)标志
//接收用
unsigned char xdata RecChar[RECNUM]; //接受数组
signed char xdata RecCounter; //接受字符指针
signed char xdata RdCounter; //读接收缓冲区的指针
unsigned char xdata TmpData[7];
//调用CRC校验程序
extern unsigned char CalCrc(unsigned char CRC_t,unsigned char dat);
unsigned char xdata Crc;
union
{
float f;
unsigned char c[4];
unsigned long int li;
}tmp;
extern void DispStr(unsigned char code *ptr_code);
extern unsigned char code err_10[];
extern void DispDigital(signed long li,signed char pos);
extern void delay (unsigned int loop);
extern unsigned char code err_11[]; // = {0x0e,0x1a,0x1a,0x20,0x01,0x01}; //Err 11
unsigned char code SENDCHAR[] = {
0x02,0x12,'O','K',0x20,0x20,0, //接收的数据正确。
0x02,0x12,'N','G',0x20,0x20,0, //接收的数据错误,并请求重发
0x02,0x12,'A','S',0x20,0x20,0, //请求发送数据。
0x02,0x12,'A','K',0x20,0x20,0, //接收的数据正确并请求再次发送。
0x02,0x12,'S','U',0x20,0x20,0, //关闭传感器和A/D转换的电源。
0x02,0x12,'N','A',0x20,0x20,0, //没有有效的内码可发送
};
void chk_oe(void)
{
// out_num = 0x5; //发送长度-1
out_ptr = 1;
SBUF = outbuff[0];
in_send = 1;
}
void SendStr(unsigned char num)
{
unsigned char loop,ch;
// num = num*7;
Crc = 0;
for (loop = 0; loop<6;loop++)
{
ch = SENDCHAR[loop+num*7];
outbuff[loop] = ch;
Crc = CalCrc(Crc,ch);
}
outbuff[6] = Crc;
out_num = 0x06;
chk_oe();
}
void int_es(void) interrupt 4 //串口中断
{
if ( _testbit_(RI) )
{
RecChar[RecCounter]=SBUF;
RecCounter ++;
r_succes_b = TRUE;
if(RecCounter >= RECNUM)
{
RecCounter = 0;
}
}
if (TI)
{
TI=0;
if (in_send)
{
if (out_num)
{
SBUF = outbuff[out_ptr++]; //polishrequest[out_ptr++];
out_num--;
}
else in_send = 0;
}
}
}
void InitUart(void)
{
EA = 0;
/* T2CON=0x30;
TR2=FALSE;
TH2=0xff; ///9600
RCAP2H=0xff;
TL2=0xdc;
RCAP2L=0xdc;
TR2 = TRUE;
T2CON=0x30;
TR2 = FALSE;
TH2=0xff; ///4800
RCAP2H=0xff;
TL2=0xb8;
RCAP2L=0xb8;
TR2 = TRUE;
T2CON=0x30;
TR2 = FALSE;
TH2=0xff; ///2400
RCAP2H=0xff;
TL2=0x70;
RCAP2L=0x70;
TR2 = TRUE;*/
T2CON=0x30;
TR2 = FALSE;
TH2 = 0xfe; ///1200
RCAP2H = 0xfe;
TL2 = 0xe0;
RCAP2L = 0xe0;
TR2 = TRUE;
EA = 1;
RdCounter = RecCounter = 0;
}
unsigned char GetChar(void) //从接收缓冲区读出字符
{
unsigned char ch;
if (RdCounter == RecCounter) return(0);
ch = RecChar[RdCounter];
RdCounter++;
if ( RdCounter >= RECNUM ) RdCounter = 0;
return(ch);
}
/*void find_CR(void)
{
for ( ; ; )
{
if (RdCounter == RecCounter) return;
if (RecChar[RdCounter] == 0x0d) return;
RdCounter++;
if ( RdCounter >= RECNUM ) RdCounter = 0;
}
}*/
//从接收缓冲区的读指针之后num个位置读出字符,但读指针不变化
unsigned char RdChar(unsigned char num)
{
num = RdCounter+num;
if ( num >= RECNUM) num = num - RECNUM;
return(RecChar[num]);
}
//读出缓冲区中的数据(主要是内码)
bit RdBufData(void)
{
signed char num;
unsigned char ch;
unsigned char Crc;
unsigned char loop;
num = RecCounter - RdCounter;
if (num < 0) num = num + RECNUM;
if (num < 7) return(FALSE);
BRecData = TRUE;
for ( ; ; )
{
ch = RdChar(0);
if (ch == 0x02)
{
Crc = 0;
for (loop=0; loop<6; loop++)
{
ch = RdChar(loop);
TmpData[loop] = ch;
Crc = CalCrc(Crc,ch);
}
if (Crc != RdChar(6) ) goto Rd_0;
ACC = TmpData[2];
ACC = ACC >> 4;
CY = ACC & 0x01; //ax带进位右移
pick = CY;
pick = TRUE; //假定PICK有效
CY = ACC & 0x01;
stab = CY;
CY = ACC & 0x01; //ax带进位右移
bat_crane = CY;
tmp.c[0] = 0;
tmp.c[1] = TmpData[3];
tmp.c[2] = TmpData[4];
tmp.c[3] = TmpData[5];
ad_out = tmp.li;
RdCounter = RdCounter + 7;
if (RdCounter >= RECNUM) RdCounter = RdCounter - RECNUM;
return(TRUE);
}
else
{
Rd_0: GetChar(); //跳过0x02字符
num--;
if (num<7) return(FALSE);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -