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

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

uart0連續(xù)接收最大只能達到512個字節(jié),如何解決?

作者:32位處理器 欄目:ARM技術
uart0連續(xù)接收最大只能達到512個字節(jié),如何解決?
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位處理器
沒有大蝦知道嗎?
自己頂一下。

3樓: >>參與討論
zhan_cl
re
是不是你的1kb中有一個字符和HEADER_BYTE相同,如果是的話請修改一下。

4樓: >>參與討論
local_mach
在度工
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位處理器
問題依舊
TO chan_cl大蝦:
    中斷服務程序識別了第一個HEADER_BYTE后,接下來的1KB都不會再去識別,而且在數(shù)據(jù)正文不會出現(xiàn)HEADER_BYTE。

TO local_mach大蝦:
    你的程序思路和我的相似,不過我的數(shù)據(jù)包是定長的,所以在中斷直接識別了一個數(shù)據(jù)包,并設置相關的標志。

謝謝兩位的回復,我還得繼續(xù)找原因。

6樓: >>參與討論
local_mach
應該是你程序的問題了,仔細看看自己的程序
 
參與討論
昵稱:
討論內容:
 
 
相關帖子
周工,請問我用JTAG調試,怎樣測量delay(2)函數(shù)所花的時間呀!
請問lpc22系列芯片的引腳是兼容的嗎
大家知道嗎???
程序從內部flash到外部RAM運行的問題
請問:LPC2xxx中有沒有硬件乘法器?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


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