微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助STC12C5A60S2第二串口

求助STC12C5A60S2第二串口

时间:10-02 整理:3721RD 点击:
期望实现的功能是:当串口调试助手发送给串口2 0xAA后 单片机通过串口2连续发送数组sendbuffer给上位机,当发送来的是0xFF
时停止发送
望大神们给看下,我的程序毫无反应。
void UartInit2(void)                //9600bps@11.0592MHz
{
        AUXR &= 0xf7;                //波特率不倍速
        S2CON = 0x50;                //8位数据,可变波特率
        BRT = 0xFD;                //设定独立波特率发生器重装值
        AUXR &= 0xfb;                //独立波特率发生器时钟为Fosc/12,即12T
        AUXR |= 0x10;                        //启动独立波特率发生器
               
        IE2=0x01;       //允许串口2中断ES2=1
}       
void sendoneByte(uchar c)
{
S2CON =S2CON&0xFD;//TI=0
S2BUF=c;
while(!(S2CON&0xFD));
S2CON =S2CON&0xFD;

void sendString(uchar *aaa)
{
while(*aaa!='\0')
{
sendoneByte(*aaa);
aaa++;
}
}
void Com2_Service(void) interrupt 8
{
    if(S2CON & S2RI)
    {
        S2CON=S2CON&0xFE;//清标志位
           accept=S2BUF;
        if(accept==0xAA)//AA开始传送
    {
        com2flag=1;
        //sendString(sendbuffer);
        }
        if(accept==0xFF)//结束命令
        {
           com2flag=0;
        }
        }
             
}
void main()
{   
        UartInit2();
        EA=1;//开总中断
        while(1)
        {
         if( com2flag==1)
          {
          sendString(sendbuffer);
          }
          if(com2flag==0)
          {
          IE2=0x00;
          }
         }        
       
}
         

你一上电就把IE2关掉了。怎么能通信

观摩观摩学习了

/********************************************************************************
                                 修改版
************************************************************************************/
void UartInit2(void)                //9600bps@11.0592MHz
{
        AUXR &= 0xf7;                //波特率不倍速
        S2CON = 0x50;                //8位数据,可变波特率
        BRT = 0xFD;                //设定独立波特率发生器重装值
        AUXR &= 0xfb;                //独立波特率发生器时钟为Fosc/12,即12T
        AUXR |= 0x10;                        //启动独立波特率发生器
               
        IE2=0x01;       //允许串口2中断ES2=1
}        
void sendoneByte(uchar c)
{//这句话不需要
//S2CON =S2CON&0xFD;//TI=0
//关串口2中断
IE2 = 0X00;
S2BUF=c;
while(!(S2CON&0xFD));
S2CON =S2CON&0xFD;
//打开串口2中断
  IE2 = 0X01;

void sendString(uchar *aaa)
{
while(*aaa!='\0')
{
sendoneByte(*aaa);
aaa++;
}
}
void Com2_Service(void) interrupt 8
{
    if(S2CON & S2RI)
    {
          S2CON=S2CON&0xFE;//清标志位
           accept=S2BUF;
        if(accept==0xAA)//AA开始传送
    {
        com2flag=1;
        //sendString(sendbuffer);
        }
        if(accept==0xFF)//结束命令
        {
           com2flag=0;
        }
        }

   
}
void main()
{   
        UartInit2();
        EA=1;//开总中断
        while(1)
        {
         if( com2flag==1)
          {
          sendString(sendbuffer);
          }
         //不能加这句话,要不然,程序刚开始运行时候,com2flag=0的,则执行 IE2=0x00;将串口中断关闭,以后再也接收不到数据。
          //if(com2flag==0)
        //  {
         // IE2=0x00;
       //   }
         }            
}

学习技术。学习技术。学习技术。

!!1

谢谢,你的程序给了我提示,帮我解决了长延时不能发送的问题,真的谢谢你。同时你的程序好像还有存在一个问题,这里
void sendoneByte(uchar c)
{
S2CON =S2CON&0xFD;//TI=0
S2BUF=c;
while(!(S2CON&0xFD));
S2CON =S2CON&0xFD;

这样的话一次不能发送太多字节,这样就可以
void sendoneByte(uchar c)
{
S2CON =S2CON&0xFD;//TI=0
S2BUF=c;
while(!(S2CON&0xFD));
S2CON =S2CON&0xFD;

希望这对其它朋友也有帮助

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top