This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:接收超时

Guru**** 2330830 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/592772/tm4c1294ncpdt-receive-timeout

器件型号:TM4C1294NCPDT

大家好、

我必须在配置为9位 UART 模式的应用中使用 UART (UART7)。 我实现了接收结束将由 RX 超时中断签名的逻辑。 中断服务例程如下所示:

void Interrupt (){
uint32_t intState = map_UARTIntStatus (MODBUS_UART、TRUE);
if (intState & UART_INT_9BIT){
//首次写入必须是从器件地址
_receivedpdu.unerialize (static_cast) (MAP_UARTCharGet (MODBUS_UART)));
MAP_UARTIntClear (MODBUS_UART、UART_INT_9BIT);
}

IF (intState & UART_INT_RX){
while (MAP_UARTCharsAvail (MODBUS_UART)))}{
_receivedpdu.uniledcast (static_cast) (MAP_UARTCharGet (MODBUS_UART)));
}


if (intState & UART_INT_RT){
xSemaphoreGiveFromISR (_receiveSemaphore、NULL);
MAP_UARTIntClear (MODBUS_UART、UART_INT_RT);
}

如您所见、有三个条件:

  • 检查我们是否收到了地址帧
  • 检查我们是否应该读出数据
  • 检查超时:通知 FreeRTOS 线程接收完成

FreeRTOS 线程如下所示:

SetRS485DriverToTxDir ();
Send9BitAddress ()
SendByte ();
while (UARTBusy ());

SetRS485DriverToRTxDir ();

//如果
(xSemaphoreTake (_receiveSemaphore、50)= pdFALSE)、则等待50 ms;}
错误返回

但我经历过、我会收到接收超时中断、即使没有人向我发送数据(没有电缆连接到电路板)、因此信号量将被获取、而不会超时。 另一个信息:当我通过调试器检查外设时、我看到数据寄存器包含0x500、即:

  • 中断错误
  • 奇偶校验错误
  • EMPY 数据(数据= 0x0)

有人能帮我吗?这种奇怪的行为有什么原因呢?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    未连接差分通信电缆时、并非所有 RS485线路驱动器/接收器都"满意"。 (您说"未连接电缆。) 插入该电缆和"静音"远程发送器可能会加强您的初始测试?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    诺伯特
    一些提示(没有任何提示会直接回答您的问题...)
    -作为一个好的做法、清除中断标志应该在 ISR 内尽快完成(在你完成此操作后、硬件中有一种缓冲区可以将该位保持几个周期)。 因此、在处理该位后不要清除该位、而是在 intState = MAP_UARTIntStatus (MODBUS_UART、TRUE)后立即清除该位;
    -使清除变为条件没有逻辑-一旦您将 int 原因复制到 intState,清除所有标志。 使用上述例程、如果代码由于任何其他原因而进入 ISR、则 MCU 将在那里循环无限-因此、其他原因永远不会清除。
    -通常情况下、应用于_RX 和_RT 的服务是相同的:将新到达的字节提交给任何消耗的字节。 _RT 只是一个额外的中断引擎、用于确保为那些最后几个到达的字节提供服务、但这些字节的数量不足以打破触发_RX 的 FIFO 阈值。
    -确保_receivedpdu.qualize()是一个快速例程,它不调用它下面的任何内容(我不知道它的来源)-只是为了避免在 ISR 内部进行长时间处理。
    至于神秘的中断、如 CB1所述、浮点电路生成最终转换的情况并不少见... 无论采用哪种方式、您的软件都需要处理消息中接收到的无效字节...
    此致
    布鲁诺