13270|5

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

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;
        }
    }
}

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

此帖出自NXP MCU论坛

最新回复

这样肯定是不能判断的,我理解是,串口接收时,同时只能接收最大缓冲个数据,在这些数据没有拷贝之前,它不会接收任何数据。例如,16字节的缓冲,那么一次接收16字节数据,当你把这些数据读完事,U1LSR就被清零了,告诉你缓冲区没有数据了,你读取完缓冲中的数据的过程中,并没有收到新的数据。 U1LSR应该不是这样用的,是接收中断后,循环读取数据判断用的,读完缓冲就退出,但无法判断一帧数据是否接收完成。。。。。。switch (U1IIR & 0x0E) { case 0x0C: // 若为超时中断(注意此处不要加break) case 0x04: // 若为接收中断 while ((U1LSR & 0x01) == 1) // 若U1RBR包含有效数据 Rec_Buffer[index++] = U1RBR; // 保存接收到的数据 } 复制代码 [ 本帖最后由 zhaojun_xf 于 2012-8-30 13:50 编辑 ]  详情 回复 发表于 2012-8-30 13:49
点赞 关注
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
中断中只负责接收数据,超过缓冲就计数清零就可以了,不知道你干嘛要这样判断
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

板凳
 
中断中只负责接收数据,超过缓冲就计数清零就可以了,不知道你干嘛要这样判断
此帖出自NXP MCU论坛

点评

版主,可以讲清楚点吗?我的目的是想把数据接收完后再进行处理,可每次接收完16个字节,U1LSR就自动设置为FIFO内没有其他数据了。是不是照你的意思,我需要分开来接收数据呢?而且我的缓冲是足够大的,能容纳最长  详情 回复 发表于 2012-8-30 09:09
 
个人签名我的博客
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

4
 
原帖由 zhaojun_xf 于 2012-8-29 13:23 发表
中断中只负责接收数据,超过缓冲就计数清零就可以了,不知道你干嘛要这样判断

版主,可以讲清楚点吗?我的目的是想把数据接收完后再进行处理,可每次接收完16个字节,U1LSR就自动设置为FIFO内没有其他数据了。是不是照你的意思,我需要分开来接收数据呢?而且我的缓冲是足够大的,能容纳最长的数据。谢谢版主了!被折磨了两天了
此帖出自NXP MCU论坛

点评

这样肯定是不能判断的,我理解是,串口接收时,同时只能接收最大缓冲个数据,在这些数据没有拷贝之前,它不会接收任何数据。例如,16字节的缓冲,那么一次接收16字节数据,当你把这些数据读完事,U1LSR就被清零了,  详情 回复 发表于 2012-8-30 13:49
 
 
 

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

5
 

回复 4楼 stonerockboy 的帖子

这样肯定是不能判断的,我理解是,串口接收时,同时只能接收最大缓冲个数据,在这些数据没有拷贝之前,它不会接收任何数据。例如,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 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢版主了!
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表