Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当我增加UART波特率时,为什么字节之间的延迟会增加?_C_Serial Port_Embedded_Avr_Uart - Fatal编程技术网

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

C 当我增加UART波特率时,为什么字节之间的延迟会增加?,c,serial-port,embedded,avr,uart,C,Serial Port,Embedded,Avr,Uart,一些有趣的事情值得注意,我还没有完全理解。我的UART初始化为9600波特。我通过逻辑分析仪查看了线路上的发送,我发送的字节延迟最小。它是每字节36µs,这是预期值 现在,如果我用不同的波特率初始化UART,比如115200,那么发送的每个字节之间的延迟会显著增加。它跳到每字节125µs 这导致了一个问题,因为我必须在某一点上提高波特率,但对我的响应有时间限制 延迟是否应该减少字节之间的,因为它应该以相同的频率发送更多的位 此阻塞方法用于写入UART static inline void uar

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

现在,如果我用不同的波特率初始化UART,比如115200,那么发送的每个字节之间的延迟会显著增加。它跳到每字节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();
}
static inline void uart2\u putchar(uint8\u t数据)
{
//禁用中断以获得对环出缓冲区的独占访问权。
cli();
if(环缓冲区为空(&环缓冲区输出2)){
//缓冲区中的第一个数据,启用数据准备中断
UCSR2B |=(1三点检查:

  • 您是否足够快地输入缓冲区?如果不够快,则增加的间隔是由于您提供的数据代码,而不是由于处理器的内部行为。(使用切换引脚来查找)

  • 是否可能因为速度的提高,您的代码每次传输数据时都会关闭数据寄存器空中断? 您可以使用put_字符串(数组、长度)一次用多个字符填充它,而不是使用put_字符填充您的ringbuffer(例如,使用memcopy,当数据必须在缓冲区末尾换行时,考虑将其拆分为两个mwmcopy操作)。 (同样,请使用拨动销找出答案)

  • 将包装到cli()和sei()中的代码减少到最小值。切换使用标志检查填充缓冲区,并将此部分从cli sei部分中排除


祝你好运!

只要你足够频繁地调用uart2\u putchar(),你的循环缓冲区就永远不会为空,你测量的间隔是由中断响应时间决定的


但是,当您增加波特率时,清空缓冲区的速度会快得多。直到中断处理程序发现缓冲区为空且无法传输字节的临界点。您测量的间隔现在由您调用uart2_putchar()的速率决定.

听起来您的问题与握手延迟和/或程序以管道能够处理的速度提供数据的能力有关。这是使用ATMega2560,我正在写入设备上的硬件UART。不应该存在任何握手问题。没有意义的是,延迟为什么会随着波特率的增加而增加容易,反之亦然。我想应该是相反的。在的人可能更适合回答你的问题,除非你能给我们看你正在使用的代码。你的代码可能正在等待UART发出准备就绪的信号,或者可能在某处有阻塞方法调用。在任何情况下,125微秒每秒响应约8K字节(每秒约80K位,给定或获取奇偶校验位),所以你应该已经非常接近理论上的最大吞吐量了。那么你使用的是中断而不是轮询?你有没有尝试过一个轮询循环,它能以尽可能快的速度传输,而不是这种环形的东西?基本上把问题一分为二,然后再对半,等等。这个问题与uart有任何关系吗?它是st吗严格地基于代码量?是基于中断开销吗?是您的代码中特定的东西吗?等等。中断太多,处理器无法处理。我切换到轮询,所有事务几乎没有延迟。
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);
    }
}