|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
uart0連續(xù)接收最大只能達到512個字節(jié),如何解決? |
| 作者:32位處理器 欄目:ARM技術 |
用LPC2104的UART0接收來自PC的數(shù)據(jù),PC的端口發(fā)送1KB的數(shù)據(jù)包,可是UART0的只接收到512B,后面的512B都丟棄了,有什么辦法嗎? 波特率115.2kbps,1字節(jié)FIFO觸發(fā) void __irq IRQ_UART0(void) { uint8 TEMP; VICVectAddr=0x00; TEMP=U0IIR; if ((TEMP&0x01)==0){ //有中斷掛起 TEMP&=0x0f; SWITCH (TEMP){ //Rx線狀態(tài)錯誤 case 0x06: break; //Rx數(shù)據(jù)可用 case 0x04: TEMP=U0RBR; //讀取FIFO并清除中斷 if (header_flag){ buff.uart0_rec_buff[uart0_buff_index++]=TEMP; if (uart0_buff_index>=1024){ header_flag=0; end_flag=1; uart0_buff_index=0; } } else { if (TEMP==HEADER_BYTE) header_flag=1; } break; //字符超時指示 case 0x0c: break; //THRE發(fā)送保持寄存器空 case 0x02: break; default: break; } } } |
| 2樓: | >>參與討論 |
| 作者: 32位處理器 于 2005/7/19 10:51:00 發(fā)布:
沒有大蝦知道嗎? 自己頂一下。 |
|
| 3樓: | >>參與討論 |
| 作者: zhan_cl 于 2005/7/19 17:48:00 發(fā)布:
re 是不是你的1kb中有一個字符和HEADER_BYTE相同,如果是的話請修改一下。 |
|
| 4樓: | >>參與討論 |
| 作者: local_mach 于 2005/7/19 17:55:00 發(fā)布:
在度工 void __irq IRQ_UART1_SERVERS(void) { uint8 UART1_IRQ_CHOICE,UART1_RBR_TEMP; // 程序變量 UART1_IRQ_CHOICE = U1IIR; // 讀狀態(tài),同時清中斷 if(UART1_IRQ_CHOICE & 0x02) // 發(fā)送中斷 { if(DRIVER_SERVER1_INDEXS < DRIVER_SERVER1_NUMBER) // 發(fā)送數(shù)據(jù) { //Terminal_String_Intermit("\n UART1發(fā)送: "); //Terminal_DataHex_Intermit(DRIVER_SERVER1_AMORTIZE[DRIVER_SERVER1_INDEXS]); U1THR = DRIVER_SERVER1_AMORTIZE[DRIVER_SERVER1_INDEXS]; DRIVER_SERVER1_INDEXS++; } else if(DRIVER_SERVER1_INDEXS >= DRIVER_SERVER1_NUMBER) // 發(fā)送最后一個字節(jié)引起的中斷 { // 釋放該空間 OSSemPost(DRIVER_UART1_POWER); // 發(fā)出串品操作權空閑信號量 } }// 發(fā)送服務程序結束 if(UART1_IRQ_CHOICE & 0x04) // 接收中斷 { UART1_RBR_TEMP = U1RBR; // 從寄存器取出數(shù)據(jù) DRIVER_RECE1_STACK[DRIVER_RECE1_STACK_INDEXS] = UART1_RBR_TEMP; DRIVER_RECE1_STACK_INDEXS++; // 索引加1 DRIVER_RECE1_STACK_NUMBER++; // 數(shù)據(jù)個數(shù) if(DRIVER_RECE1_STACK_INDEXS >= DRIVER_RECE1_STACK_SIZE) // 注意復位入數(shù)據(jù)索引 DRIVER_RECE1_STACK_INDEXS = 0; //Terminal_String_Intermit("\n UART1: "); //Terminal_DataHex_Intermit(UART1_RBR_TEMP); }// 接收服務程序結束 VICVectAddr = 0x00; // 通知VIC中斷處理結束 } // UART1中斷設置 VICVectAddr4 = (uint32)IRQ_UART1_SERVERS; // 設置UART1中斷向量地址 VICVectCntl4 = 0x27; // UART1通道分配到第4通道 VICIntEnable = 0x00000080| VICIntEnable; // 使能UART1中斷 // 設置串行口UART1的引腳功能 PINSEL0 = (PINSEL0 & 0xfff0ffff) | 0x00050000; // 選擇管腳為UART1 U1LCR = 0x83; // 允許訪問分頻因子寄存器 U1DLM = (Fpclk / (16*DRIVER_UART1_BPS))/256; // 設置波特率 U1DLL = (Fpclk / (16*DRIVER_UART1_BPS))%256; // 設置波特率 U1LCR = 0x03; // 禁 |
|
| 5樓: | >>參與討論 |
| 作者: 32位處理器 于 2005/7/20 9:19:00 發(fā)布:
問題依舊 TO chan_cl大蝦: 中斷服務程序識別了第一個HEADER_BYTE后,接下來的1KB都不會再去識別,而且在數(shù)據(jù)正文不會出現(xiàn)HEADER_BYTE。 TO local_mach大蝦: 你的程序思路和我的相似,不過我的數(shù)據(jù)包是定長的,所以在中斷直接識別了一個數(shù)據(jù)包,并設置相關的標志。 謝謝兩位的回復,我還得繼續(xù)找原因。 |
|
| 6樓: | >>參與討論 |
| 作者: local_mach 于 2005/7/20 22:23:00 發(fā)布:
應該是你程序的問題了,仔細看看自己的程序 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |