这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » uart0,512 uart0连续接收最大只能达到512个字节,如何解决?

共2条 1/1 1 跳转至

uart0,512 uart0连续接收最大只能达到512个字节,如何解决?

院士
2006-09-17 18:14:16     打赏
uart0,512 uart0连续接收最大只能达到512个字节,如何解决?



关键词: uart0     连续     接收     最大     能达到     512个         

院士
2006-12-22 22:43:00     打赏
2楼
问 用LPC2104的UART0接收来自PC的数据,PC的端口发送1KB的数据包,可是UART0的只接收到512B,后面的512B都丢弃了,有什么办法吗?

波特率115.2kbps,1字节FIFO触发

void __irq IRQ_UART0(void)
{
uint8 temp;

    VICVectAddr=0x00;

    temp=U0IIR;
    if ((temp&0x01)==0){     //有中断挂起
        temp&=0x0f;
        switch (temp){
            //Rx线状态错误
            case 0x06:      
              break;
              
            //Rx数据可用
            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发送保持寄存器空
            case 0x02:
              break;
              
            default:
              break;     
        }    
    }
} 1: 没有大虾知道吗?自己顶一下。 2: re是不是你的1kb中有一个字符和HEADER_BYTE相同,如果是的话请修改一下。 3: 在度工void __irq IRQ_UART1_SERVERS(void)
{
    uint8   UART1_IRQ_CHOICE,UART1_RBR_TEMP;                              // 程序变量

    UART1_IRQ_CHOICE = U1IIR;                                             // 读状态,同时清中断
    

    if(UART1_IRQ_CHOICE & 0x02)                                           // 发送中断
    {
        if(DRIVER_SERVER1_INDEXS < DRIVER_SERVER1_NUMBER)                 // 发送数据
        {
            //Terminal_String_Intermit("\n UART1发送: ");       
            //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)           // 发送最后一个字节引起的中断
        {
            // 释放该空间
            OSSemPost(DRIVER_UART1_POWER);                                // 发出串品操作权空闲信号量            
        }
    }// 发送服务程序结束


    if(UART1_IRQ_CHOICE & 0x04)                                           // 接收中断
    {
        UART1_RBR_TEMP = U1RBR;                                              // 从寄存器取出数据

        DRIVER_RECE1_STACK[DRIVER_RECE1_STACK_INDEXS] = UART1_RBR_TEMP;

        DRIVER_RECE1_STACK_INDEXS++;                                      // 索引加1
        DRIVER_RECE1_STACK_NUMBER++;                                      // 数据个数

        if(DRIVER_RECE1_STACK_INDEXS >= DRIVER_RECE1_STACK_SIZE)          // 注意复位入数据索引
            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;                                                         // 禁止访问分频因子寄存器  且设置为8,1,n
    U1IER = 0x03;                                                         // 发送中断,接收中断,BIT0是RBR使能中断,BIT1是THRE使能中断
    U1FCR = 0x00;                                                         // 初始化FIFO        
     4: 问题依旧TO chan_cl大虾:
    中断服务程序识别了第一个HEADER_BYTE后,接下来的1KB都不会再去识别,而且在数据正文不会出现HEADER_BYTE。

TO local_mach大虾:
    你的程序思路和我的相似,不过我的数据包是定长的,所以在中断直接识别了一个数据包,并设置相关的标志。

谢谢两位的回复,我还得继续找原因。 5: 应该是你程序的问题了,仔细看看自己的程序

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]