找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2038|回复: 8
收起左侧

调用单片机串口2发送卡死

[复制链接]
ID:734017 发表于 2021-9-13 15:59 | 显示全部楼层 |阅读模式
本帖最后由 happy2058 于 2021-9-13 18:23 编辑

芯片是8H1K08 51hei截图_20210913181729.png
工作流程序,屏幕通串口1发送数据给控制板、控制板返回要显示数据给屏幕。再通过串口2发送操作数据给功能板2.
在没加入串口2部分代码前,屏幕与控制板操作通信已经调试完成。加入串口2后,造成中断冲突,卡死
之前在贴子里找问了,说可以串口1和串口2共用定时器2.

以下是部份程序
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)                        //1T

sfr AUXR = 0x8e;
sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr IE2 = 0xaf;
sfr T2L = 0xD7;
sfr T2H = 0xD6;

uchar buf[16];    /缓存区
uchar rp = 0;

uchar RF_data_intensity[6]={0xEE,0xEF,0xF2,0xAE,0x00,0x0D};  //串口2 要发送的数据

void UartInit()
{
        
        S2CON = 0x50;                //串口2
        SCON = 0x50;                         //串口1
        AUXR = 0x15;                        //启动定时器2
        T2L = BRT;
        T2H = BRT >> 8;                        
        ES = 1;                                 //串口1中断
        EA = 1;                                
        //IE2 |=0x01;                        //串口2中断
}

void send_string( uchar *str, uchar strlen)  //串口1发送
   {  
     uchar k= 0 ;  
         do  
    {  
          SBUF = (*(str + k));
                        
      k++;
                 while (TI==0);  
             TI= 0 ;
    }  
         while (k < strlen);
        
   }

void send_string_uart2( uchar *str, uchar strlen)  //串口2发送
   {  
     uchar k= 0 ;  
         do  
    {  
          S2BUF = (*(str + k));
                        
      k++;
                 while (S2CON==0x50);  
             S2CON &= ~0x02;
    }  
         while (k < strlen);
        
   }

void interrupt_uart() interrupt 4  //串口1中断
{
               
    if (RI)  
        {  
                        RI = 0 ;               
                        buf[ rp++ ] = SBUF;
                        if(SBUF==0X3C)
                                rp=0;
                                                        
        }
}

void facecare_RF_TXD()              ////串口2发送函数
{

                send_string_uart2(RF_data_intensity,6);


}


void main()
{
                        
                        P_SW2 |= 0x80;
                        //CKSEL = 0x00;                                           内部IRC
                        CLKDIV =0x02;                                            //2分频
                        //CLK_DIV &= 0xF8;                            Ö÷ê±Öó
                        P1M0 = 0x00;      //串口2模式 准双口
                        P1M1 = 0x9c;      //串口2模式 准双口
                        P3M0 = 0x00;      
                        P3M1 = 0xe0;        
                        
        
                        Timer0(); //定时器0
                        UartInit();  /串口启动

while(1)

switch(buf[1])                                                         //屏幕下发数据
  {
          case 0X79:

if(        buf[3]==0xb6 && buf[7]==0x3c)
                {                                
                        memset(buf, 0, 16); //清空缓存
                        if( RF>=1)
                                RF--;
                        facecare_TXD(RF, current_X[3],current_X2[3]);   //串口1发送给屏数据
                        
                ES = 0;                   //关串口1中断
                        IE2 |=0x01;                   //开串口2中断
                        facecare_RF_TXD();           //串口2发送给功能板数据              
                        
                        IE2 &=0xF0;             //关串口2中断
                        ES = 1;           //开串口1中断
                }
                if(        buf[3]==0xb7 && buf[7]==0x3c)
                {                                
                        memset(buf, 0, 16); //Çå¿ÕÑ-»μÇø        
                        if( RF<20)
                                RF++;
                        facecare_TXD(RF, current_X[3],                        current_X2[3]);
                        ES = 0;
                        IE2 |=0x01;
                        facecare_RF_TXD();
                        
                        IE2 &=0xF0;
                        ES = 1;
                }

        }               

回复

使用道具 举报

ID:624769 发表于 2021-9-13 16:58 | 显示全部楼层
你的:       while (S2CON==0x50);

这里应该 : while(S2CON & 0x02) !=0x02);   才对吧?
回复

使用道具 举报

ID:624769 发表于 2021-9-13 17:10 | 显示全部楼层
uchar k= 0 ;  
         do  
    {  
          S2BUF = (*(str + k));
                        
      k++;
                 while (S2CON==0x50);  
             S2CON &= ~0x02;
    }  
         while (k < strlen);
另外,这个写法……, 真的没关系么? 一般的写法好像应该:
for(k= 0 ; k<strlen;k++)
{  
          S2BUF = *(str++);
          while ((S2CON & 0x02)==0);  
          S2CON &= ~0x02;
}  

这样子么?
回复

使用道具 举报

ID:624769 发表于 2021-9-13 17:18 | 显示全部楼层
最后, 你 串口1 开了中断,但是,只对RI作了处理,没有对TI 做处理, 我不知道你什么型号的单片机,不排除,死在中断里出不来的可能。一般开了中断,都会用一个 TI_Busy的标志位 写了SBUF之后,就把 TI_Busy = 1; 然后下面 就 While(TI_Busy) ; ,  中断里面加一个  
IF(TI)
{
     TI  = 0;
     TI_Busy = 0;
}
你参考一下吧。
回复

使用道具 举报

ID:734017 发表于 2021-9-13 17:36 | 显示全部楼层
188610329 发表于 2021-9-13 16:58
你的:       while (S2CON==0x50);

这里应该 : while(S2CON & 0x02) !=0x02);   才对吧?

也试过,卡死。所以才这行直接一点
回复

使用道具 举报

ID:624769 发表于 2021-9-13 17:43 | 显示全部楼层
happy2058 发表于 2021-9-13 17:36
也试过,卡死。所以才这行直接一点

我说的中断那个, 你试了没?  
回复

使用道具 举报

ID:734017 发表于 2021-9-13 18:22 | 显示全部楼层
188610329 发表于 2021-9-13 17:43
我说的中断那个, 你试了没?

用是的8h1K08
串口1在最后一次发送完后T=0了。
回复

使用道具 举报

ID:624769 发表于 2021-9-13 19:57 | 显示全部楼层
happy2058 发表于 2021-9-13 18:22
用是的8h1K08
串口1在最后一次发送完后T=0了。

我是说,你开了中断,只要发送完,TI = 1, 就会触发中断,只要你不 TI = 0 就会不停的进入中断。换句话说,有可能,你主程序永远没有 机会执行 TI = 0;
8H1K08 我手头焊好的没有,也没办法测试。你要是不想加标志,就先不开 串口中断。光试发送呗。
回复

使用道具 举报

ID:734017 发表于 2021-9-13 21:51 | 显示全部楼层
感谢你,搞好了,原因串口2中断函数没写。我想着不接收数据,就没写了。感谢感谢。就算空函数也要加一个才行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表