stc12串口收发计算机,STC12C5A60S2单片机的串行口2数据发发送问题

本帖最后由 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        

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);

}

}

699ba7046c51816a17b33a7caa85f179.png

0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值