gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:00:30 25 4
gpt4 key购买 nike

需要注意一些有趣的事情,我还没有完全理解。我的 UART 初始化为 9600 波特。我已经通过逻辑分析仪查看了线路上的 TX,我发送的字节延迟最小。它是每字节 36µs,这是预期的。

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

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

字节之间的延迟是否应该减少,因为它应该以相同的频率发送更多位?

此阻塞方法用于写入 UART。

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

基于中断触发。

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 波特率 -- enter image description here enter image description here

~115,200 波特率 -- enter image description here

最佳答案

检查三点:

  • 您是否足够快地填充缓冲区?如果不是,则增加的差距是由于您的数据提供代码,而不是由于处理器的内部行为。 (使用切换图钉找出答案)

  • 有没有可能因为速度的提高,你的代码在每次传输数据时都关闭了数据寄存器空中断?您可以使用 put_string(array, length) 一次用多个字符填充它,而不是使用 put_char 来填充您的环形缓冲区(例如,使用 memcopy,考虑在数据必须包装时将其分成两个 mwmcopy 操作在缓冲区的末尾)。(同样,使用切换图钉找出答案)。

  • 将包裹在 cli() 和 sei() 中的代码减少到最少。开关用标志检查填充缓冲区,并将这部分从 cli-sei 部分中排除

祝你好运!

关于c - 为什么当我增加 UART 波特率时,字节之间的延迟会增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18725467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com