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.

[参考译文] TM4C129XNCZAD:循环、等待发送缓冲器清空、知道何时关闭 RS485发送器是否正确?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1355975/tm4c129xnczad-is-it-correct-to-loop-waiting-for-the-transmit-buffer-to-empty-to-know-when-to-turn-off-the-rs485-transmitter

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:EK-TM4C1294XL

我接管了一些代码、这部分对我来说似乎不正确。  我认为坐下来等待传输完成是不正确的。  有人能告诉我应该怎么做吗?

void XmitBfr_hb (void)
{
  特性;
  unsigned int i;

  Enable_Uart ___发射电缆_发射电缆_发射电缆_发射电缆_发射电缆_发射电缆_


//在电流环路中,每次我们传输一些东西,我们需要丢弃一个接收到的消息
//因为硬件已设置为接收所有消息,包括我们发送的消息
 if (TTC2000_Option=1 20mA)
 {
   MSG_TO_Discard_HB++;
 }

 for (i = 0;i < 200;i++);//允许硬件切换时间。


  for (i = 0;i < 300;i++)
  {
    Ch = get_from_output_Buffer_HB ();
    UARTCharPut (UartPort_HB、ch);
    while (UARTBusy (UartPort_HB));//更多数据纹波?
    if (out_wrptr_hb == out_rdptr_hb)
    {
      Disable_Uart ___发射电缆_发射电缆_发射电缆_发射电缆_发射电缆_发射电缆_
      中断;
    }

  }

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

    您好!

     我目前正在旅行、明天回来时、我会更深入地查看您的代码。 请记住、UART 是全双工模式。 当您发送数据时、也会接收数据。 具体如何处理接收到的数据由您的应用决定。 您的当前代码可能只是尝试忽略这些消息。 您需要找出您试图忽略的确切消息。  

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

    您好、Charles、感谢您的回复。  UART 是全双工的、通过2线 RS485与客户端连接、因此发送器 必须在每次传输后关闭、以避免与下一个回复发生冲突。

    代码正在工作--您可以忽略有关丢弃消息的部分。

    我担心软件执行的时序。  我认为坐下来等待传输完成是不正确的。

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

    尊敬的 Mark:

    如果您在代码中引用以下行、那么我真的不会看到通过轮询 UARTBusy 等待 UART 完成传输的问题。 我认为、为了避免冲突、关闭 UART 之前、您的代码正在等待 UART 传输完成。  

        while (UARTBusy (UartPort_HB));//更多数据纹波?

    如果您看看 TivaWare SDK 中的 UART 示例,它有一个类似的 UARTBusy ()调用。  

    //
    // Send the data, which was prepared above, over the UART configured for
    // internal loopback operation.
    //
    for(ui32index = 0 ; ui32index < NUM_UART_DATA ; ui32index++)
    {
    UARTCharPut(UART7_BASE, ui8DataTx[ui32index]);
    }

    //
    // Wait for the UART module to complete transmitting.
    //
    while(MAP_UARTBusy(UART7_BASE))
    {
    }

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

    非常感谢您的答复。  我们使用9600波特与现场监测计进行通信。  当波特率为9600时、发送一个字符大约需要1ms。  在大多数应用中、您都不认为这是大问题吗? 大多数传输长度可能为30个字符或更少。  一次(在配置文件数据传输期间)可以超过100个字符。

    在该仪器的前一版本中、我有一个1ms 的周期性中断、在中断中、我会检查发送寄存器是否为空、然后关闭发送器、这样我就不必让主循环坐下来等待了。  我还没有想出如何使用此芯片来实现这一点。

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

    尊敬的 Mark:

    在本仪器的前一版本中、我有一个1ms 的周期性中断、在中断中、我要检查发送寄存器是否为空、然后关闭发送器、这样我就不必设置主循环等待了。

    您可以对 TM4C129执行相同的操作以启用中断而不是轮询。  

     C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\uart_echo 使用中断模式。