欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 調用單片機串口2發送卡死 [打印本頁]

作者: happy2058    時間: 2021-9-13 15:59
標題: 調用單片機串口2發送卡死
本帖最后由 happy2058 于 2021-9-13 18:23 編輯

芯片是8H1K08
工作流程序,屏幕通串口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;
                }

        }               


作者: 188610329    時間: 2021-9-13 16:58
你的:       while (S2CON==0x50);

這里應該 : while(S2CON & 0x02) !=0x02);   才對吧?
作者: 188610329    時間: 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;
}  

這樣子么?
作者: 188610329    時間: 2021-9-13 17:18
最后, 你 串口1 開了中斷,但是,只對RI作了處理,沒有對TI 做處理, 我不知道你什么型號的單片機,不排除,死在中斷里出不來的可能。一般開了中斷,都會用一個 TI_Busy的標志位 寫了SBUF之后,就把 TI_Busy = 1; 然后下面 就 While(TI_Busy) ; ,  中斷里面加一個  
IF(TI)
{
     TI  = 0;
     TI_Busy = 0;
}
你參考一下吧。
作者: happy2058    時間: 2021-9-13 17:36
188610329 發表于 2021-9-13 16:58
你的:       while (S2CON==0x50);

這里應該 : while(S2CON & 0x02) !=0x02);   才對吧?

也試過,卡死。所以才這行直接一點
作者: 188610329    時間: 2021-9-13 17:43
happy2058 發表于 2021-9-13 17:36
也試過,卡死。所以才這行直接一點

我說的中斷那個, 你試了沒?  
作者: happy2058    時間: 2021-9-13 18:22
188610329 發表于 2021-9-13 17:43
我說的中斷那個, 你試了沒?

用是的8h1K08
串口1在最后一次發送完后T=0了。
作者: 188610329    時間: 2021-9-13 19:57
happy2058 發表于 2021-9-13 18:22
用是的8h1K08
串口1在最后一次發送完后T=0了。

我是說,你開了中斷,只要發送完,TI = 1, 就會觸發中斷,只要你不 TI = 0 就會不停的進入中斷。換句話說,有可能,你主程序永遠沒有 機會執行 TI = 0;
8H1K08 我手頭焊好的沒有,也沒辦法測試。你要是不想加標志,就先不開 串口中斷。光試發送唄。
作者: happy2058    時間: 2021-9-13 21:51
感謝你,搞好了,原因串口2中斷函數沒寫。我想著不接收數據,就沒寫了。感謝感謝。就算空函數也要加一個才行




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1