打印
[NXP ARM]

求教一个串口发送的问题

[复制链接]
1176|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baidudz|  楼主 | 2010-4-30 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
深入LPC2131》中有一个用中断实现串口接收的程序,我发现程序中只考虑了RDA中断,因此当发送的数据不是8的整数倍的时候会出现余数的数据还在FIFO中。
  我添加了对THRE中断的处理:
...
volatile uint8 add_data;
void __irq IRQ_UART0(void)
{
    uint8 i;

    if ((U0IIR & 0x0F) == 0x04)
    {
        rcv_new = 1;

        for (i = 0; i<8; i++)
        {
            rcv_buf[i] = U0RBR;
        }
    }
    /*begin by Jesse Chen*/
    if ((U0IIR & 0xF) == 0x0C)
    {
        add_data = 1;
        rcv_byte = U0RBR;
    }
         /*end*/
   
    VICVectAddr = 0x00;
}
  这样就解决了不能及时收全的问题。但是我又发现会出现中断频繁处理的问题。求教在串口编程中如何平衡这个中断频繁的问题?

相关帖子

沙发
hsbjb| | 2010-4-30 10:21 | 只看该作者
处理超时中断时,将FIFO中的所有数据都一次读出就不会老发生中断了

使用特权

评论回复
板凳
hsbjb| | 2010-4-30 10:21 | 只看该作者
你的程序一次只读一个字节,FIFO中剩下的数据还会引发接收超时中断。

    if ((U0IIR & 0xF) == 0x0C)
    {
        add_data = 1;
        rcv_byte = U0RBR;
    }

使用特权

评论回复
地板
gxgclg| | 2010-4-30 10:31 | 只看该作者
如何读取FIFO中全部数据?

使用特权

评论回复
5
dfsa| | 2010-4-30 10:33 | 只看该作者
这个问题不难

使用特权

评论回复
6
dfsa| | 2010-4-30 10:34 | 只看该作者
下面就是读取FIFO中所有数据的方法:
   
    // read all the data in FIFO once. Then there is no too much interruptions
    if ((U0IIR & 0xF) == 0x0C)
    {
        add_data_num = 0;
        while (U0LSR & 0x00000001)// Read UART's LSR register first, and determine whether FIFO is empty or not
        {                     
            add_data = 1;                                   rcv_byte[add_data_num] = U0RBR;
            add_data_num++;
        }
    }

使用特权

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

本版积分规则

239

主题

2284

帖子

0

粉丝