音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe

為什么串口中斷會死機

作者:Torda 欄目:單片機
為什么串口中斷會死機
void SerialInt(void) interrupt 4
{
    UINT8 i;
    UINT16 wCount;
    UINT8 byLen;

    // 接收中斷處理
    if (!RI)
    {
        return;
    }

    ES = 0;

    wCount = 0;
    byLen  = 0;

    // 沒有接受命令
    if (!g_bRecvCmdOk)
    {
        // ==========接收起始字節(jié)0x02==========
        g_byCommand[STATION_SYNC_BYTE] = SBUF;
        RI = 0;

        // 同步字節(jié)錯
        if (g_byCommand[STATION_SYNC_BYTE] != SYNC_BYTE)
        {
            ES = 1;
            return;
        }

        // ==========接收數(shù)據(jù)長度0x02==========
        // 等待數(shù)據(jù)到達
        while ((!RI) && (wCount < RECV_DELY_COUNT))
        {
            wCount++;
        }

        // 超時
        if (wCount >= RECV_DELY_COUNT)
        {
            RI = 0;

            ES = 1;
            return;
        }
        wCount = 0;

        // 保存收到的命令字節(jié)數(shù)
        g_byCommand[STATION_LEN] = SBUF;
        RI = 0;

        // 長度越界,直接返回
        if ((g_byCommand[STATION_LEN] >= COMMAND_LEN_PARA_MAX)
         || (g_byCommand[STATION_LEN] == 0))
        {
            ES = 1;
            return;
        }

        // 根據(jù)長度接收后續(xù)的字節(jié)
        byLen = g_byCommand[STATION_LEN];
        for (i = 0; i < byLen; i++)
        {
            // 沒有數(shù)據(jù)到達
            while ((!RI) && (wCount < RECV_DELY_COUNT))
            {
                wCount++;
            }

            // 超時
            if (wCount >= RECV_DELY_COUNT)
            {
                RI = 0;
                ES = 1;
                return;
            }
            wCount = 0;

            g_byCommand[i + STATION_CMD] = SBUF;
            RI = 0;
        }

        g_bRecvCmdOk = TRUE;
    }

    ES = 1;
}

發(fā)送命令格式如下:起始字符    長度    命令字    參數(shù)

但是當長度后面不帶任何數(shù)據(jù),然后利用測試工具發(fā)送這樣錯誤的字符串,導致系統(tǒng)死機。如果數(shù)據(jù)是正確的,則不會死機。
比如發(fā)送0x55 0x01 0x02,10次/S,不會死機。但是發(fā)送0x55 0x01 ,10次/S,系統(tǒng)會死機。不知道是什么原因。系統(tǒng)資源占用情況如下:RAM:202字節(jié)(共256字節(jié)),FLASH:48K(總共是64K)。請高手指點,謝謝!




2樓: >>參與討論
wydian
全是return 當然死了
 
3樓: >>參與討論
computer00
樓上的倒是說說,為什么return就會死機?
 
4樓: >>參與討論
puppyh
return編譯后是ret還是reti?
 
5樓: >>參與討論
computer00
如果是中斷服務函數(shù),return當然是生成reti。
如果是普通函數(shù),return就生成ret。

6樓: >>參與討論
zhang_lj
你在中斷中干的事情太多了
類似這種幀傳輸,順序性很強,建議中斷中只干一件事情:保存數(shù)據(jù)
然后再檢查保存的數(shù)據(jù),我懷疑         // 根據(jù)長度接收后續(xù)的字節(jié)
死在這里了,或者,你應該首先RI=0,安全。
#define EOI  enter//定義回車為幀尾,具體值自己查
byte UartRcvBuf[32];//空間自己定
int  UartWritePtr, UartReadPtr;
byte RcvBuf[50];
byte RcvLen;
byte SendBuf[50];
byte SendLen;
void UartInt() interrupt 4 using 2
{
     if(RI)
     {
    RI = 0;
        UartRcvBuf[UartWritePtr++] = SBUF;
        UartWritePtr &= 0x1F;//環(huán)形邏輯
     }
     else if(TI)
     {
    TI=0;
        if(SendLen)
        {
       SBUF = SendBuf[SendLen--];
    }
     }
}
void RcvFrame()
{
    static step = 0;//空間自己定
    SWITCH(step)
   {
    case 0:
           if(UartWritePtr==UartReadPtr)//指針相等,沒有數(shù)據(jù)進入buf
           {
        return;
           }
           
           RevBuf[RcvLen++]=UartRcvBuf[UartReadPtr++];
           UartReadPtr &= 0x1F;
           if(EOI==RcvBuf[RcvLen-1])
           {
        step++;
           }
           break;
        case 1:
           SendLen = RcvLen;
           step = 0;
           for(byte i=0; i<SendLen-1; i++)
           {
        SendBuf[i]= RcvBuf[RcvLen-l-i];
           }
           RcvLen = 0;
           
           SBUF = EOI;// 填充一個字符,觸發(fā)串口發(fā)送中斷
           
           break;
   }
}
void main()
{
    InitChip();
        while(1)
        {
       //WatchDog();
           RcvFrame();
        }
}

7樓: >>參與討論
2shift
中斷程序弄這么長干什么?設標志,主程序處理
 
8樓: >>參與討論
dengm
TI ?
    if (!RI)
    {
        return;
    }
===========>>>>
    if (!RI)
    {
        TI=0;
        return;
    }


9樓: >>參與討論
kingsr
^_^
看到頭有點暈

10樓: >>參與討論
沈老
測試輸出是:0x55 0x01 0x55 0x01 ......?
因為測試輸出的是:
0x55 0x01 0x55 0x01 ...
請分析頭3個輸出:0x55 0x01 0x55 會產生什么?

11樓: >>參與討論
hotpower
晚上有空看看~~~
 
12樓: >>參與討論
yanfengzhu
當然死了。
        // 等待數(shù)據(jù)到達
        while ((!RI) && (wCount < RECV_DELY_COUNT))
        {
            wCount++;
        }

等的黃花菜都涼了。

13樓: >>參與討論
xwj
樓上搞錯了,循環(huán)RECV_DELY_COUNT次就退出了
 
參與討論
昵稱:
討論內容:
 
 
相關帖子
請問:我用51仿真器在用戶板上調試已OK.....
求教計數(shù)初值問題
關于設計48*16漢字顯示屏的問題
請教19位地址線存儲器的C編程問題
請問單片機引腳能夠驅動多長的距離?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號