打印

提高UART发送速度的方法

[复制链接]
3032|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
barryyan|  楼主 | 2010-7-29 19:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,小弟最近在写UART发送中断的时候遇到问题。
用的是ADI的芯片,直接用寄存器进行操作。看了它的UART例程,用的是TX buffer empty中断。TX是一个8位寄存器。部分程序如下:

void IRQ_Handler(void) __irq
{
  //UART中断内容,当TX空后产生中断,并给Main一个标识
    unsigned long ucCOMIID0 = 0;
   
    if ((IRQSTATUS & BIT11) == BIT11)    //UART interrupt source
    ucCOMIID0 = COMIID0;                    // read interrupt state
    if ((ucCOMIID0 & 0x2) == 0x2)      // Transmit buffer empty
    {
          ucTxBufferEmpty = 1;   
    }
}

main()
{
// 前面的一些配置内容省略,下面是将一串字节通过UART发送的程序      
for ( i = 0 ; i < nLen ; i++ )   
                {      
                    COMTX = a[i];   
                    while (ucTxBufferEmpty ==0);
                    ucTxBufferEmpty = 0;                     
                }               
}

假设a是一个多字节的数组。
我的理解是每当把a的一个字节内容放到TX后,TX就开始发送到终端。当TX中的8位数据都发出去后,就产生一个中断,并把标识给Main,让它将第二个字节的内容赋给TX。这样就把几个字节的数据发出去了。我试验过,确实可行。

(1)我的理解是否正确?

但是我现在做的项目中,发现问题还是出现在UART发送的速度问题上。
一个同事建议我不要用while (ucTxBufferEmpty ==0);等待数据发完,再发一个字节,说这样耗时多。
说用读写指针的方法,如果读指针与写指针不在同一位置时,就继续发送。

(2)我不知道这个算不算环形缓冲区的作法?  这样真能提高UART的发送速度吗?

(3)我觉得TX就是一个8位的寄存器。发送数据的话,总是一个字节发完,再发一个字节的,我不清楚为什么他说的那个方法能够提高效率。

上述3个问题,还请各位大侠指点一二,小弟不胜感激!

相关帖子

沙发
maxmin| | 2010-7-30 17:12 | 只看该作者
最简单的办法是提高波特率!

使用特权

评论回复
板凳
barryyan|  楼主 | 2010-7-31 11:47 | 只看该作者
2# maxmin

我的波特率已经最高了,256000了。所以想办法,能够提高CPU的执行效率。

使用特权

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

本版积分规则

37

主题

137

帖子

0

粉丝