首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我增加UART波特率时,字节之间的延迟会增加?

为什么当我增加UART波特率时,字节之间的延迟会增加?
EN

Stack Overflow用户
提问于 2013-09-10 17:37:55
回答 2查看 2.1K关注 0票数 2

一些有趣的事情,我还没有完全理解。我的UART被初始化为9600波特。我通过逻辑分析器查看了行上的TX,并且我发送的字节延迟最小。它是每字节36秒,这是预期的。

现在,如果我用不同的波特率(比如115,200 )初始化UART,那么发送的每个字节之间的延迟会显著增加。它会跳转到每字节125 s。

这造成了一个问题,因为我必须提高波特率在某个时候,但有一个时间限制我的反应。

延迟不应该减少字节间的,因为它应该以相同的频率发送更多的比特吗?

此阻塞方法用于向UART写入。

代码语言:javascript
复制
static inline void uart2_putchar(uint8_t data)
{
    // Disable interrupts to get exclusive access to ring_buffer_out.
    cli();
    if (ring_buffer_is_empty(&ring_buffer_out2)) {
        // First data in buffer, enable data ready interrupt
        UCSR2B |=  (1 << UDRIE2);
    }
    // Put data in buffer
    ring_buffer_put(&ring_buffer_out2, data);

    // Re-enable interrupts
    sei();
}

是基于中断触发的。

代码语言:javascript
复制
ISR(USART2_UDRE_vect)
{
    // if there is data in the ring buffer, fetch it and send it
    if (!ring_buffer_is_empty(&ring_buffer_out2)) {
        UDR2 = ring_buffer_get(&ring_buffer_out2);
    }
    else {
        // no more data to send, turn off data ready interrupt
        UCSR2B &= ~(1 << UDRIE2);
    }
}

时序图如下:

~9600波特率--

~115,200波特率--

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-11 12:36:42

有三点需要检查:

  • 你给缓冲器喂得够快吗?否则,差距的增加是由于您的数据提供代码,而不是由于处理器的内部行为。(用开关销找出答案)
  • 由于速度的提高,您的代码是否有可能在每次传输数据时都关闭数据寄存器的空中断?您可以使用一个put_char (数组、长度)来同时填充多个字符,而不是使用一个put_string(数组、长度)来填充它(例如,当数据必须在缓冲区的末尾包装时,可以考虑将它分割成两个mwmcopy操作)。(再一次,使用切换针来找出答案)。
  • 将代码减少到cli()和sei()中。开关用标志检查填充缓冲区,并将此部分排除在cli-sei部件之外。

祝好运!

票数 5
EN

Stack Overflow用户

发布于 2013-09-11 12:51:33

只要您足够频繁地调用uart2_putchar(),循环缓冲区就永远不会是空的,并且所测量的间隙由中断响应时间决定。

然而,当您增加波德率时,您将更快地清空该缓冲区。直到一个临界点,中断处理程序将发现缓冲区为空,无法传输一个字节。您所测量的差距现在取决于您调用uart2_putchar()的速率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18725467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档