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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2827|回復: 8
打印 上一主題 下一主題
收起左側

調用單片機串口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;
                }

        }               

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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;
}
你參考一下吧。
回復

使用道具 舉報

5#
ID:734017 發表于 2021-9-13 17:36 | 只看該作者
188610329 發表于 2021-9-13 16:58
你的:       while (S2CON==0x50);

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

也試過,卡死。所以才這行直接一點
回復

使用道具 舉報

6#
ID:624769 發表于 2021-9-13 17:43 | 只看該作者
happy2058 發表于 2021-9-13 17:36
也試過,卡死。所以才這行直接一點

我說的中斷那個, 你試了沒?  
回復

使用道具 舉報

7#
ID:734017 發表于 2021-9-13 18:22 | 只看該作者
188610329 發表于 2021-9-13 17:43
我說的中斷那個, 你試了沒?

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

使用道具 舉報

8#
ID:624769 發表于 2021-9-13 19:57 | 只看該作者
happy2058 發表于 2021-9-13 18:22
用是的8h1K08
串口1在最后一次發送完后T=0了。

我是說,你開了中斷,只要發送完,TI = 1, 就會觸發中斷,只要你不 TI = 0 就會不停的進入中斷。換句話說,有可能,你主程序永遠沒有 機會執行 TI = 0;
8H1K08 我手頭焊好的沒有,也沒辦法測試。你要是不想加標志,就先不開 串口中斷。光試發送唄。
回復

使用道具 舉報

9#
ID:734017 發表于 2021-9-13 21:51 | 只看該作者
感謝你,搞好了,原因串口2中斷函數沒寫。我想著不接收數據,就沒寫了。感謝感謝。就算空函數也要加一個才行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表