|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(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 于 2006/6/28 21:55:00 發(fā)布:
全是return 當然死了 |
|
| 3樓: | >>參與討論 |
| 作者: computer00 于 2006/6/28 23:35:00 發(fā)布:
樓上的倒是說說,為什么return就會死機? |
|
| 4樓: | >>參與討論 |
| 作者: puppyh 于 2006/6/30 10:28:00 發(fā)布:
return編譯后是ret還是reti? |
|
| 5樓: | >>參與討論 |
| 作者: computer00 于 2006/6/30 11:10:00 發(fā)布:
如果是中斷服務函數(shù),return當然是生成reti。 如果是普通函數(shù),return就生成ret。 |
|
| 6樓: | >>參與討論 |
| 作者: zhang_lj 于 2006/6/30 12:47:00 發(fā)布:
你在中斷中干的事情太多了 類似這種幀傳輸,順序性很強,建議中斷中只干一件事情:保存數(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 于 2006/6/30 16:31:00 發(fā)布:
中斷程序弄這么長干什么?設標志,主程序處理 |
|
| 8樓: | >>參與討論 |
| 作者: dengm 于 2006/6/30 17:44:00 發(fā)布:
TI ? if (!RI) { return; } ===========>>>> if (!RI) { TI=0; return; } |
|
| 9樓: | >>參與討論 |
| 作者: kingsr 于 2006/6/30 18:56:00 發(fā)布:
^_^ 看到頭有點暈 |
|
| 10樓: | >>參與討論 |
| 作者: 沈老 于 2006/7/1 15:25:00 發(fā)布:
測試輸出是:0x55 0x01 0x55 0x01 ......? 因為測試輸出的是: 0x55 0x01 0x55 0x01 ... 請分析頭3個輸出:0x55 0x01 0x55 會產生什么? |
|
| 11樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/1 15:27:00 發(fā)布:
晚上有空看看~~~ |
|
| 12樓: | >>參與討論 |
| 作者: yanfengzhu 于 2006/7/1 22:57:00 發(fā)布:
當然死了。 // 等待數(shù)據(jù)到達 while ((!RI) && (wCount < RECV_DELY_COUNT)) { wCount++; } 等的黃花菜都涼了。 |
|
| 13樓: | >>參與討論 |
| 作者: xwj 于 2006/7/2 0:47:00 發(fā)布:
樓上搞錯了,循環(huán)RECV_DELY_COUNT次就退出了 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |