📄 uart.c
字号:
//uart.c
//
#include "AppDefine.h"
bit bdata bFrameSt; //帧头
extern unsigned int Val_Mytime, Val_Uptime, Val_ad, Val_Actdata, Val_Actdir;
extern unsigned char Val_Mystatus;
extern unsigned char COMMFlag; //
unsigned char COMMInLenght; //
unsigned char COMMInIndex; //
unsigned char COMMInSum; //
unsigned char COMMInBuff[8]; //
extern unsigned char RUNflag; //
/*****************************通讯程序***********************************/
/**************************************************************************/
void Uart_Init(unsigned char smod, unsigned char ctime)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
switch(smod)
{
case 1:
PCON = 0x80; //SMOD=1;
break;
case 0:
default:
PCON = 0x00; //SMOD=0;
break;
}
TL1 = ctime;
TH1 = TL1;
TR1 = 1; // timer 1 run
//中断
ES = 1;
//
EN485 = 0;//RECEIVE
//
COMMInLenght = 0;
COMMInIndex = 0;
COMMInSum = 0;
bFrameSt = 0;
}
//向串口发送一个字符 data
void Uart_SendChar(unsigned char ch)
{
EN485 = T_EN485;
ES = 0;
SBUF = ch;
while(TI==0);
TI = 0;
ES = 1;
EN485 = R_EN485;
}
//向串口发送一帧数据 address + data
unsigned char Uart_SendFrame(unsigned char addr, unsigned char *ch, unsigned char datalen)
{
unsigned char i, sendlen=0, sum=0;
EN485 = T_EN485;
ES = 0;
SBUF = 0x7f;
while(TI==0);
TI = 0;
sendlen++;
SBUF = addr;
while(TI==0);
TI = 0;
sum += addr;
sendlen++;
for(i=0;i<datalen;i++)
{
sum += *ch;
SBUF = *ch++;
while(TI==0);
TI=0;
sendlen++;
}
SBUF = sum;
while(TI==0);
TI = 0;
sendlen++;
ES = 1;
EN485 = R_EN485;
return sendlen;
}
//串口接收中断函数,分为接收4字节和8字节
void Uart_INT () interrupt 4 using 1
{
if(RI)
{
unsigned char ch;//,i;
ES = 0;
RI = 0;
ch = SBUF;
if(bFrameSt == 0)//bFrameSt=0
{
if(ch == 0x7f){//帧头
bFrameSt = 1;
}
}
else{//bFrameSt=1
switch(COMMFlag)
{
case CMD_NO_FLAG:
if(ch == BG485ADDR){//广播地址
COMMFlag = CMD_RESET_FLAG;
COMMInLenght = CMD_RESET_NUM;
COMMInIndex = 0;
COMMInSum = 0;
COMMInBuff[COMMInIndex] = ch;
}
else if(ch == MY485ADDR){//data
if(RUNflag != RUN_NO_FLAG){
COMMFlag = CMD_DATA_FLAG;
COMMInLenght = CMD_DATA_NUM;
COMMInIndex = 0;
COMMInBuff[COMMInIndex] = ch;
}else{
COMMFlag = CMD_NO_FLAG;
COMMInLenght = 0;
COMMInIndex = 0;
COMMInBuff[COMMInIndex] = 0x0;
bFrameSt = 0;
}
}
break;
case CMD_DATA_FLAG:
COMMInIndex++;
COMMInBuff[COMMInIndex] = ch;
if(COMMInIndex == CMD_DATA_NUM)
COMMFlag = CMD_END_FLAG;
//Uart_SendChar(COMMInIndex);
break;
case CMD_RESET_FLAG:
COMMInIndex++;
COMMInBuff[COMMInIndex] = ch;
if(COMMInIndex == CMD_RESET_NUM)
COMMFlag = CMD_END_FLAG;
//Uart_SendChar(COMMInIndex);
break;
case CMD_END_FLAG:
//Uart_SendChar(0xf);
break;
default:
COMMFlag = CMD_NO_FLAG;
COMMInLenght = 0;
COMMInIndex = 0;
COMMInBuff[COMMInIndex] = 0x0;
bFrameSt = 0;
//Uart_SendChar(',');
break;
}
}
ES = 1;
}//end of RI
}
//串口处理程序
void Uart_Do(void)
{
unsigned char i;
unsigned char COMMOutLenght; //
unsigned char COMMOutBuff[5]; //返回buffer
if(COMMFlag == CMD_END_FLAG)
{
//sum
COMMInSum = 0;
for(i=0;i<(COMMInIndex-1);i++)
COMMInSum += COMMInBuff[i];
if(COMMInSum == COMMInBuff[(COMMInLenght-1)])
{
//addr
if(COMMInBuff[0] == MY485ADDR)//data
{
if(COMMInBuff[1] == DATA_SEND_CMD)//send acq data 0x53
{
RUNflag = RUN_ACQ_FLAG;
COMMOutLenght = 5;//5 data len
COMMOutBuff[0] = Val_Mytime>>8;//time
COMMOutBuff[1] = Val_Mytime;
COMMOutBuff[2] = Val_ad>>8;//AD
COMMOutBuff[3] = Val_ad;
COMMOutBuff[4] = Val_Mystatus;//故障码
Uart_SendFrame(MY485ADDR, COMMOutBuff, COMMOutLenght);
}
else if(COMMInBuff[1] == DATA_RECV_CMD)//接收后的回应 0x52
{
RUNflag = RUN_ACT_FLAG;
Val_Actdata = COMMInBuff[2];//执行 data
Val_Actdata = (Val_Actdata << 8) + COMMInBuff[3];
Val_Actdir = COMMInBuff[4];//方向,R和L
//执行程序(电机)
if(Val_Actdata <= 0){
PWM_stop();
DAMP_R = 1; //1 off //0 on
DAMP_L = 1;
}
else{
PWM_stop();
PWM_changfreq(Val_Actdata);
if(Val_Actdir == 'L'){//左转 0x4C
PWM_DIR = 1;
DAMP_R = 1;
DAMP_L = 0;
}
else{ //右转'R'和默认 0x52
PWM_DIR = 0;
DAMP_L = 1;
DAMP_R = 0;
}
PWM_run();
}
COMMOutLenght = 5;//5 data len
COMMOutBuff[0] = Val_Mytime>>8;//time
COMMOutBuff[1] = Val_Mytime;
COMMOutBuff[2] = Val_Actdata>>8;//AD
COMMOutBuff[3] = Val_Actdata;
COMMOutBuff[4] = Val_Mystatus;//故障码
Uart_SendFrame(MY485ADDR, COMMOutBuff, COMMOutLenght);
}
}
else if(COMMInBuff[0] == BG485ADDR)//广播地址
{
Val_Uptime = COMMInBuff[2];//time
Val_Uptime = (Val_Uptime << 8) + COMMInBuff[3];
Val_Mytime = Val_Uptime;
RUNflag = RUN_RESET_FLAG;
//Uart_SendChar('1');
}
else{//addr不对,丢弃,重新来
//if(RUNflag == RUN_NO_FLAG)
// RUNflag = RUN_NO_FLAG;
//LED_ERR = 1;
//Uart_SendChar(0xfc);
}
}
else{//sum不对,丢弃,重新来
///RUNflag = RUN_NO_FLAG;
LED_ERR = 1;
//Uart_SendChar(0xfe);
}
COMMFlag = CMD_NO_FLAG;
COMMInLenght = 0;
COMMInIndex = 0;
COMMInSum = 0;
COMMInBuff[COMMInIndex] = 0x0;
bFrameSt = 0;
}//end of CMD_END_FLAG
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -