单片机/MCU论坛
直播中

evanboys

7年用户 14经验值
擅长:可编程逻辑 嵌入式技术 接口/总线/驱动 控制/MCU
私信 关注
[问答]

在线求助!!!stc16c5a60s编写了一个双串口通讯程序,现在是串口后接收有问题,希望哪位大哥能帮忙

程序如下: 串口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!='') //只要*P不为空,就一直发送
    {
        SBUF=*P;
        P++;
        while(!TI);
        TI=0;
    }
    REN=1;
    ES = 1;
}

/****************读取一次结果********************/
void read_ac()
{
    int current = 0;
    int i;
    Clear_Buff();//清除串口1,2缓冲
    read_once();  //读取单次数据
    delay_ms(10);
//        for(i=0;i //        {
//        UART_1SendOneByte(Uart2_buff[i]);
//          UART_1SendOneByte('n');
//        UART_1SendOneByte('*');
//        }
    sprintf(echo,"DC:%.1f mA",TDM_Receive_Check());
    Uart_1_SendString(echo);
    Clear_Buff();//清除串口缓冲
}
/****************读取电流表函数********************/
void read_once()
{
    uint Sum_check = 0;
    Sum_check = 0xfe + 0x02;
    UART_2SendOneByte(Code_head1);
    UART_2SendOneByte(Code_head2);
    UART_2SendOneByte(0x02);
    UART_2SendOneByte(0xFE);
    UART_2SendOneByte(0x01);
    UART_2SendOneByte(0x00);
}
/*
*格式化打印给上位机函数,输入是十六进制电流值,输出串口字符串
*/
void dispplay(int _data)
{
    int temp;
    temp = _data;
    if (temp == 0x8000)//判断是否是超量程,表的PDF档有介绍
    {
        Uart_1_SendString("OL");
    }
    else
    {
        if (temp < 0)
        {
            Uart_1_SendString("-");//输出负号
            temp *= -1;//变成正值
        }
        serial_put_uint(temp);
    }
}

/*
*对串口2接收到的数据进行检查如果校验位OK,返回读出的电流值
*/
float TDM_Receive_Check()
{
    float value;
    if((Uart2_buff[0]==0xAA)&&(Uart2_buff[1]==0x55)&&(Uart2_buff[2]==0x04)&&(Uart2_buff[3]==0xF6))
    {
        if(( Uart2_buff[6]*256+Uart2_buff[7])==(Uart2_buff[2]+Uart2_buff[3]+Uart2_buff[4]+Uart2_buff[5]))
        {
            value =(((Uart2_buff[5]<<8)+(Uart2_buff[4])));//mA档中。
            return value;                                 //如果接收校验OK返回读出来的值。
        }
    }
    else
    {
        return 0x8888;//十进制:34952
    }

}
/*************清除串口1,2数组*****************/

void Clear_Buff()
{
    int i;
    for(i=0; i     {
        Uart2_buff[i]=0;
    }
    for(i=0; i     {
        Uart1_buff[i]=0;
    }
}
void delay_ms(uint ms)
{
    int i;
    for(i=0; i     {
        _nop_();
    }
}
已退回20积分

回帖(2)

人中狼

2020-4-5 22:43:10
if(flag2==1)
程序里没有对flag2置1的地方
举报

chenwei6991627

2020-4-7 08:58:54
程序问题很多,静下心来慢慢看
举报

更多回帖

发帖
×
20
完善资料,
赚取积分