程序如下: 串口1接收发送都可以使用,串口2发送测试也是可以用的,现在问题就是卡在接收上,接收有问题
麻烦
论坛大神帮忙看看串口2接收哪里有问题,万分感谢!!!
/***********************************************************************
时间:2020.04.04
芯片:STC12C5A60S2
晶振:11.0592MHz 波特率:115200bps
引脚定义:串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0
串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2
功能描述:STC12双串口
通信(中断方式)
当串行口1接收数据后,将此数据由串行口2发送出去
当串行口2接收数据后,将此数据由串行口1发送出去
***********************************************************************/
#include
#include "intrins.h"
#include "string.h"
#include "stdio.h"
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2ti 0x02 //串口2发送中断请求标志位
#define uchar unsigned char
#define uint unsigned int
#define S2RI 0x01
#define S2TI 0x02
#define Code_head1 0xAA
#define Code_head2 0x55
#define len 25
bit busy2; //此位用于串口判断是否发送繁忙
char xdata Uart2_buff[40]; //缓冲数据
char xdata Uart1_buff[40];
uchar count2=0; //串口计数器
uchar count1=0; //串口计数器
char xdata echo[40];
unsigned char flag1,flag2,temp1,temp2;
void Clear_Buff(); //清除串口1,2中数组的值,为下一次做准备
void read_code2(uchar _char); //保存串口接收到的字符
void Uart_1_SendString(char *P); //串口1 发送字符串函数
float TDM_Receive_Check();
void set_brrate();
void serial_put_uint(unsigned int number);
void dispplay(int _data);
void read_ac();
void read_once();
void delay_ms(uint ms);
/****************串行口初始化函数****************/
void InitUART(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
/****************************115200******************************/
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x10; //启动独立波特率发生器
IE2=0x01;//允许串口2中断。
EA=1;//总中断一定要开,不然能发送,不能接收
}
/****************串行口1发送****************/
void UART_1SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //若TI=0,在此等待
TI = 0;
}
/****************串行口2发送****************/
void UART_2SendOneByte(unsigned char c)
{
S2BUF = c;
while(!(S2CON&S2TI)); //若S2TI=0,在此等待
S2CON&=~S2TI; //S2TI=0
}
/*****************主函数******************/
void main(void)
{
InitUART(); //串行口初始化
Uart_1_SendString("*****************************rn");
Uart_1_SendString("************00000***********rn");
while(1)
{
int i;
//如果串口1接收到数据,将此数据由串口2发送
if(flag1==1)
{
flag1=0;
for(i=0; i
{
UART_1SendOneByte(Uart1_buff[i]);
}
read_ac();
Uart_1_SendString("rn");
Clear_Buff();
}
//如果串口2接收到数据,将此数据由串口1发送
if(flag2==1)
{
flag2=0;
UART_1SendOneByte(temp2);
}
}
}
/************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4 using 3
{
if(RI)
{
RI=0;
ES=0;//关掉串口总中断。
Uart1_buff[count1]=SBUF;
switch(Uart1_buff[count1])
{
case 'r':
flag1=1;
count1=0;
ES=0;
REN=0;
break;
case 'n':
flag1=1;
count1=0;
ES=0;
REN=0;
break;
default:
count1++;
}
ES=1;//再开串口中断。
}
}
/************串行口2中断处理函数*************/
void UART_2Interrupt(void) interrupt 8 using 2
{
if(S2CON & S2RI)//判断是否有接收中断。
{
S2CON &= 0xFE;//清除串口2接收中断。
ES=0;//关掉串口总中断。
Uart2_buff[count2]=S2BUF;
count2++;
ES=1;//再开串口中断。
}
}
/*----------------------------
串口1发送函数:
参数: 字符串
返回值: None
----------------------------*/
void Uart_1_SendString(char *P)
{
ES = 0;
REN=0;
while(*P!='