Embedded 为什么我们需要延迟UART通信中的字节读取?

Embedded 为什么我们需要延迟UART通信中的字节读取?,embedded,system,uart,Embedded,System,Uart,我们有一个奇怪的问题,因为我不是一个经验丰富的嵌入式系统开发人员,所以我无法解决这个问题 我们使用两个时钟速度不同的MCU。我们在它们之间有一个UART连接。我们使用了115200的波特率,只有一些错误。我们切换到9600,我们得到了更多的错误(这是奇怪的imho) 我们发现,从MCUfast->MCUslow进行的通信一直正常。但是来自MCUslow->MCUfast的通信有错误 现在我们的解决方案开始发挥作用,但我不知道为什么: 读取每个字节后,我们在MCUfast中断处理程序中内置了1ms

我们有一个奇怪的问题,因为我不是一个经验丰富的嵌入式系统开发人员,所以我无法解决这个问题

我们使用两个时钟速度不同的MCU。我们在它们之间有一个UART连接。我们使用了115200的波特率,只有一些错误。我们切换到9600,我们得到了更多的错误(这是奇怪的imho)

我们发现,从MCUfast->MCUslow进行的通信一直正常。但是来自MCUslow->MCUfast的通信有错误

现在我们的解决方案开始发挥作用,但我不知道为什么:

读取每个字节后,我们在MCUfast中断处理程序中内置了1ms的延迟。现在我们不再有任何错误。

由于在while循环中使用延迟并不是一个好的计划,我试图找出导致这种行为的原因,找出一个可以接受的修复方法

以前有没有人遇到过这样的问题,能给我指出正确的方向

提前谢谢

编辑

void D10::OnUsartInterrupt(void* Context)
{
    D10* Con = (D10*)Context;

    while ((uint32_t)Con->DataSerial->GetStatus() & (uint32_t)UsartStatus::RXReady)
    {
        Con->Data[Con->Index++] = Con->DataSerial->Receive();
        Con->MessageReady = true;
        PowerManager::DelayMs(1);   
    }   
}

看起来你不是在等待你应该等待的旗帜。或者波特率预设不准确。等等。这几乎肯定是一个软件错误,因此没有实际的代码,任何答案都只是猜测。while循环中的延迟并不是一个特别的问题-中断处理程序中的延迟是,甚至中断处理程序中的while循环也可能是。对于答案,我们需要查看您的中断处理程序和其他相关的UART代码(初始化等),并且您需要指定精确的MCU零件号。目前,您要求我们通过前门的钥匙孔查看,并要求美国告诉您后卧室的eh墙纸的颜色!根据UART预分频器计算两端使用的实际波特率以及MCU之间的差异。您肯定需要等待显示字节已到达的标志。您内置的时间与以9600波特传输一个字节所需的时间非常匹配。我假设您的ISR在Con->Data at index Con->index中放置的是字节,对吗?Con->Data的消费者是什么样子的,会不会有一个从线程和ISR更新Con->Index的竞争?