STC12C5A60S2单片机的串行口2数据发发送问题

2019-07-15 16:10发布

本帖最后由 695704098 于 2015-9-2 17:23 编辑

想实现的功能呢就是:使用串口调试助手的文本格式发送字符1,单片机通过串口2接收后验证通过,发送一次数组Str1[5]内5个的字符数据,通过串口调试助手接收查看发送出来的数据。
目前的状态就是:每次复位后发送字符1,接收到一个大写打字母L,别的都没有了,而且每次复位后才能发送出来一个L,否则不管发多少次字符1,都不发出数据。
一下是本人改写的程序:
/*************** 用户定义参数 *****************************/

#define MAIN_Fosc                22118400L        //define main clock

#define Baudrate1                9600                //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样
                                                                        //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ

#define Baudrate2                9600                //define the baudrate2,
                                                                        //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ

#define                BUF_LENTH        128                //定义串口接收缓冲长度

/**********************************************************/

#include        <reg51.h>

sfr AUXR1 = 0xA2;
sfr        AUXR = 0x8E;
sfr S2CON = 0x9A;        //12C5A60S2双串口系列
sfr S2BUF = 0x9B;        //12C5A60S2双串口系列
sfr IE2   = 0xAF;        //STC12C5A60S2系列
sfr BRT   = 0x9C;


unsigned char         uart2_wr;                //写指针
unsigned char         uart2_rd;                //读指针
unsigned char         xdata RX2_Buffer[BUF_LENTH];
bit                B_ti2;


/****************** 编译器自动生成,用户请勿修改 ************************************/

#define T1_TimerReload        (256 - MAIN_Fosc / 192 / Baudrate1)                        //Calculate the timer1 reload value        at 12T mode
#define BRT_Reload                (256 - MAIN_Fosc / 12 / 16 / Baudrate2)                //Calculate BRT reload value

#define        TimeOut1                (28800 / (unsigned long)Baudrate1 + 2)
#define        TimeOut2                (28800 / (unsigned long)Baudrate2 + 2)

#define        TI2                                (S2CON & 0x02) != 0
#define        RI2                                (S2CON & 0x01) != 0
#define        CLR_TI2()                S2CON &= ~0x02
#define        CLR_RI2()                S2CON &= ~0x01

/**********************************************************/
unsigned char addr;
unsigned char Str1[5]={"LFA01"};
/******************** 本地函数声明 ***************/

void        uart2_init(void);

void        UART2_TxByte(unsigned char dat);

void        PrintString2(unsigned char code *puts);

/****************延时函数****************/
void Delay_Ms(unsigned int ms)
{
       unsigned int i;
       while(ms--)
       for(i=0;i<550;i++);
}
/*********从机编号判断和数据发送********/
//如果串口1接收到主机发来的寻址从机编号,才将本从机的数据发送给主机,否则等待
//void Send_Data(void)
//{
//  int i;
////  uchar b;               
//if(addr=='1') //不同的从机,这里必须修改
//  {   
//        for(i=0;i<5;i++)
//           {
//             UART2_TxByte(Str1);
//                 Delay_Ms(10);
//           }
//  }
//         
//}
void        main(void)
{
        int i;
        uart2_rd = 0;
        uart2_wr = 0;
        AUXR1 |= (1<<4);        //将UART2从P1口切换到 RXD2--P1.2切换到P4.2   TXD2---P1.3切换到P4.3
        
        uart2_init();

        
        while(1)
        {
//                if(addr=='1')
//                {
//                        for(i=0;i<5;i++)
//                        {
//                         UART2_TxByte(str);
//                         Delay_Ms(5);
//                        }
//                }


        }
}



void        UART2_TxByte(unsigned char dat)
{
        B_TI2 = 0;
        S2BUF = dat;
        while(!B_TI2);
        B_TI2 = 0;
}



void PrintString2(unsigned char code *puts)                //发送一串字符串
{
    for (; *puts != 0;        puts++)  UART2_TxByte(*puts);         //遇到停止符0结束
}


/**********************************************/
void        uart2_init(void)
{
        AUXR |=  (1 << 3);                //串口2波特率加倍
        S2CON  = (S2CON & 0x3f) | (1<<6);        //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率
        S2CON |= 1 << 4;                //允许串2接收

        AUXR |=  1 << 4;        //baudrate use BRT
        BRT = BRT_Reload;

        IE2 |=  1;                        //允许串口2中断
        //本来在uart1_init(void)中有定义,只是用串口2时必须有以下两条才行
        ES  = 1;
        EA = 1;
}

/**********************************************/
void UART2_RCV (void) interrupt 8
{        int a;
        int i;
        if(RI2)
        {
                CLR_RI2();
                a=S2BUF;
                addr=a;
        }
               
if(addr=='1') //不同的从机,这里必须修改
  {   
        for(i=0;i<5;i++)
           {
             UART2_TxByte(Str1);
                 Delay_Ms(10);
           }
  }
        if(TI2)
        {
                CLR_TI2();
                B_TI2 = 1;
        }
}


把这以下语在主函数的while(1)中接触屏蔽,发送一次1后就一直能收到单片机发出的数据,没有任何问题,换一个字符发送给单片机后才停止,再发1,单片机仍然能持续发送数据,但是只要是放到串口中断或是写到子函数中,在中断中调用,就每次复位只能发送一次,且只发一个L
if(addr=='1')
    {                       for(i=0;i<5;i++)
                       {
                         UART2_TxByte(str);
                         Delay_Ms(5);
                        }
                }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
顽石族
1楼-- · 2019-07-15 20:27
695704098 发表于 2015-9-3 14:58
这句CLR_TI2();就是写标志位清零吧,我这样写   
for(i=0;i

UART2_TxByte();这个函数不行吧,试试print那个函数 最佳答案
千里草三鑫
2楼-- · 2019-07-15 20:37
tainanle      啊                               啊                       啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
顽石族
3楼-- · 2019-07-16 01:24
因为放在中断里,发送了L之后,写标志位没有清零哦!
695704098
4楼-- · 2019-07-16 02:26
顽石族 发表于 2015-9-2 19:47
因为放在中断里,发送了L之后,写标志位没有清零哦!

这句CLR_TI2();就是写标志位清零吧,我这样写   
for(i=0;i<5;i++)
{
UART2_TxByte(str);
CLR_TI2();
Delay_Ms(5);
}
还是一样的效果,请问有什么好的办法能详细给我讲讲做么做吗?

一周热门 更多>