UART1串口只能接收16个字节的数据,超过16个字节的数据全部丢失

2019-03-25 20:27发布

void uart1IsrInit(void)
{
    INT16U usFdiv;
   
    U1LCR  = 0x87;                                                      // 允许设置波特率,8位数据,2位停止位
    usFdiv = (FPCLK / 16) / UART_BPS;                                   // 设置波特率                    
    U1DLM  = usFdiv / 256;
    U1DLL  = usFdiv % 256;
    U1LCR  = 0x07;                                                      // 锁定波特率                    
//    U1FCR  = 0x87;                                                      // 使能FIFO,设置8个字节触发点   
    U1FCR  = 0x07;                                                      // 使能FIFO,设置1个字节触发点   
    U1IER  = 0x01;                                                      // 使能接收中断                  
}
上面是我的初始化程序,波特率为38400。先是使用8个字节的触发点,发现接收到16个字节后,U1LSR.0位被清除;然后改为一个字节触发一次,依然是到16个字节后,U1LSR.0位被清除。请各位帮我找找问题所在,谢谢了!以下为我的中断程序。
void uart1Isr (void)
{
      
    while ((U1IIR & 0x01) == 0)           //  判断是否有中断挂起           
{                                       
        switch (U1IIR & 0x0e)           //  判断中断标志                 
  {                                          
        
            case 0x04:                                                  //  接收数据中断
    uc_RcvBuf[uc_RcvNum++] = U1RBR;
    if((U1LSR & 0x01) == 0)
    {
     uc_RcvNewFlag = 1;
     uc_RcvNum = 0;
    }
                break;
            
            case 0x0C:                                                  //  字符超时中断
                while((U1LSR & 0x01) == 0x01)       //  判断数据是否接收完毕         
    {                          
                    uc_RcvBuf[uc_RcvNum++] = U1RBR;
                }
    uc_RcvNum = 0;
    uc_RcvNewFlag = 1;
    break;
               
            default:
                break;
        }
    }
}

数据是不定长的。谢谢各位了!

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zhaojun_xf
1楼-- · 2019-03-26 01:25
 精彩回答 2  元偷偷看……
zhaojun_xf
2楼-- · 2019-03-26 05:51
中断中只负责接收数据,超过缓冲就计数清零就可以了,不知道你干嘛要这样判断
stonerockboy
3楼-- · 2019-03-26 07:21
原帖由 zhaojun_xf 于 2012-8-29 13:23 发表
中断中只负责接收数据,超过缓冲就计数清零就可以了,不知道你干嘛要这样判断

版主,可以讲清楚点吗?我的目的是想把数据接收完后再进行处理,可每次接收完16个字节,U1LSR就自动设置为FIFO内没有其他数据了。是不是照你的意思,我需要分开来接收数据呢?而且我的缓冲是足够大的,能容纳最长的数据。谢谢版主了!被折磨了两天了
zhaojun_xf
4楼-- · 2019-03-26 11:07
这样肯定是不能判断的,我理解是,串口接收时,同时只能接收最大缓冲个数据,在这些数据没有拷贝之前,它不会接收任何数据。例如,16字节的缓冲,那么一次接收16字节数据,当你把这些数据读完事,U1LSR就被清零了,告诉你缓冲区没有数据了,你读取完缓冲中的数据的过程中,并没有收到新的数据。

U1LSR应该不是这样用的,是接收中断后,循环读取数据判断用的,读完缓冲就退出,但无法判断一帧数据是否接收完成。。。。。。
  1. switch (U1IIR & 0x0E)
  2. {
  3. case 0x0C: // 若为超时中断(注意此处不要加break)
  4. case 0x04: // 若为接收中断
  5. while ((U1LSR & 0x01) == 1) // 若U1RBR包含有效数据
  6. Rec_Buffer[index++] = U1RBR; // 保存接收到的数据
  7. }
复制代码
[ 本帖最后由 zhaojun_xf 于 2012-8-30 13:50 编辑 ]
stonerockboy
5楼-- · 2019-03-26 16:24
谢谢版主了!

一周热门 更多>