久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2539|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品欧美一区二区三区不卡 | 亚洲精品视频一区二区三区 | 欧美一级大片免费看 | 干干干日日日 | 成人在线精品视频 | 性一爱一乱一交一视频 | 日韩在线一区二区三区 | 神马影院一区二区三区 | 午夜国产精品视频 | 国产1区在线 | 欧美激情在线观看一区二区三区 | 国产美女高潮 | www.久久久久久久久久久久 | av色站| 天天干天天插 | 欧美日韩a | 日韩欧美网 | 日韩精品成人免费观看视频 | 一区二区精品视频 | 婷婷久 | 亚洲网站在线观看 | 久久手机在线视频 | 激情五月激情综合网 | 精品乱码一区二区三四区 | 欧美xxxⅹ性欧美大片 | av永久免费 | 九九免费视频 | 欧美精品三区 | av喷水| 自拍偷拍亚洲一区 | 1区2区3区视频 | 国产精品久久免费观看 | 九九在线视频 | 中文成人在线 | 久久久久久久久久久国产 | 欧州一区二区三区 | 久久午夜国产精品www忘忧草 | 久久91| 一区二区三区免费在线观看 | 久久婷婷国产麻豆91 | 欧美精品日韩精品国产精品 |