打印
[ZLG-ARM]

串口中断求助

[复制链接]
2332|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
honghhh|  楼主 | 2007-12-21 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用串口0读取电度表(1200的波特率),并且希望每收到1字节数据就中断一次。这样便于对所收到的数据进行分析和处理。但我的串口中断程序每中断一次,所读到的数据有好几个字节不等。搞了半天不知道原因在哪里,请那位帮我分析一下。谢谢!
我的串口0的初始化如下:
uint16    Fdiv;
U0LCR = 0x83;
Fdiv=(Fpclk/16)/UART_BPS;
U0DLM = Fdiv/256;
U0DLL = Fdiv % 256;
U0LCR = 0x1B;        
U0FCR = 0x01;                    /* 允许FIFO,并设置触发点为1字节*/
VICIntSelect = 0x00000000;            /* 设置所有的通道为IRQ中断*/
VICVectCntl1 = 0x20 | 0x06;     /* UART0分配到IRQ slot1*/
VICVectAddr1 = (uint32)IRQ_UART0;    /* 设置UART0向量地址*/
VICIntEnable = (1 << 0x06)      /* 使能UART0中断*/
下面是我的中断处理程序:
uint8    Uart0;    
rcv_new0 = 1;
if ((U0IIR & 0x0F) == 0x04)    
  {
    rcv_buf0[l_0] = U0RBR;    // 读取FIFO的数据
    l_0 = l_0+1;        
  }    
    Uart0 = U0IIR;
    VICVectAddr = 0x00;            // 中断处理结束

相关帖子

沙发
kernel99| | 2007-12-21 12:28 | 只看该作者

这种情况应该是正常的

    虽然设置  U0FCR = 0x01;  /* 允许FIFO,并设置触发点为1字节*/
但电度表还是按1200的波特率发数据,同时你用的芯片的UxRSR通过RxD接收有效字符,并把这些字符传送至UxRBR,等待CPU访问.
    虽然每接收一个字节就中断,但是UxRBR可能就有几个字节数据的存在!

使用特权

评论回复
板凳
zlgarm| | 2007-12-21 15:32 | 只看该作者

honghhh 您好!

    你可以把出口设置为快速中断形式,加快CPU的响应时间,试试~
还有,楼主你用了其它的中断了吗?如果那样的话可能导致CPU响应延时.
                                        By zlgarm_syg

使用特权

评论回复
地板
Renx| | 2007-12-21 16:08 | 只看该作者

具体的发送形式是怎样的?

具体的发送形式是怎样的?
是隔段时间发送多个数据还是其他什么情况?隔多久?

使用特权

评论回复
5
honghhh|  楼主 | 2007-12-22 10:15 | 只看该作者

串口中断求助

昨天有事情没来得及看帖。由于这是读电度表的程序,所以我发给电度表的数据是连续发送的14个字节(按照电度表的645协议)。调试程序的时候,我是在中断处理里面设定的断点。也就是说,当串口第一次产生中断时,就会停下来的。这时我发现一个奇怪的现象:用单步调试时,它居然是一直不退出中断而是把我希望得到的18个字节全部读完后才退出来。我想是不是说在这个过程中单片机已经多次收到数据中断信号,并且单片机也已经把中断次数记录起来。然后在中断处理程序里面,也相应的进行多次处理呢?

使用特权

评论回复
6
caijd8205| | 2007-12-26 11:00 | 只看该作者

单步时,FIFO不停止接收的

  在单步调试程序时,虽然程序停在了断点的地方,但是UART控制器并没有停,所以你程序停下来时,UART控制器会继续接收总线上的数据并存放到FIFO中。在你退出中断服务程序后,因又接收到数据触发过中断,所以会再次进入中断服务程序。

使用特权

评论回复
7
Renx| | 2007-12-26 11:43 | 只看该作者

呵呵

这就难怪了!
串口是有多个中断的(LPC2000系列ARM),拿接收部分来说,就有线状态中断、接收数据可用、接收超时等。
这里应该是超时中断在起作用了。CTI(超时)中断是当接收FIFO包含至少1个字符并且在接收3.5~4.5字符的时间内没有对接收FIFO进行任何操作时产生,你这里使用断点,进行单步调试,那么就有可能是超时中断“作怪”了。
还有一种情况就是说产生线状态中断,在接收FIFO中的数据都是“错”的,它也会“不停”的产生中断,当然这种情况很小,你之前也说了,得到了你想要的数据,可能性很小,但也不是没有可能,具体还与你的发送和接收设置有关。

各芯片厂家出的东西在很多地方也会不一样,所以还要看具体的情况,还有我想问下,你具体用的平台是什么?UART是控制器自带的还是单独的UART芯片,型号是什么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

26

帖子

0

粉丝