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:UARTCharPutNonBlocking 的任何示例代码是否使用基于中断的通信而不是循环等待并关闭 RS485发送器?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420221/tm4c129xnczad-any-sample-code-for-uartcharputnonblocking-using-interrupt-based-communication-instead-of-looping-to-wait-and-turn-off-rs485-transmitter

器件型号:TM4C129XNCZAD

工具与软件:

在 uart_echo 演示中、  

while (ui32Count --)

//
//将下一个字符写入 UART。
//
MAP_UARTCharPutNonBlocking (UART0_BASE、* pui8Buffer++);
}

MAP_ 在函数名称的开头有何意义?  这个全名的定义在哪里?

是否有示例显示了在调用函数时如何处理已满的 FIFO?

谢谢

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

    尊敬的 Mark:

     这在第34.3节中的外设驱动程序库用户指南中进行了说明。 有关详细信息、请参阅它。 基本上、您使用 map_xyz 并让构建过程 解析 何时使用 rom_xyz 或 xyz。 使用 rom_xyz 可以节省闪存空间、因为 API 存储在 ROM 中、且处理器会将其从 ROM 中运行、但并非所有 API 都受 ROM 支持。 如果 rom_xyz 不可用、则 map_xyz 将在编译期间解析为 xyz、并且 API xyz 最终存储在闪存中。

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

    非常感谢。  我对此表示赞赏。  哪里有更广泛的演示代码展示如何使用 UARTCharPutNonBlocking、或者我是否需要开发我所有的逻辑?  从我可以看到、简单的 uart_echo 示例无法处理 FIFO 已满的情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="345142" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420221/tm4c129xnczad-any-sample-code-for-uartcharputnonblocking-using-interrupt-based-communication-instead-of-looping-to-wait-and-turn-off-rs485-transmitter while (ui32Count--)

    //
    //将下一个字符写入 UART。
    //
    MAP_UARTCharPutNonBlocking (UART0_BASE、* pui8Buffer++);
    }

    上述代码来自哪里? 我在 uart_echo 示例中看不到该文件、但在示例中看到了以下代码。 在下面的示例代码中、它在写入新字符之前检查 FIFO 中是否有可用空间。  


    while (MAP_UARTCharsAvail (UART0_BASE))

    //
    //从 UART 读取下一个字符并将其写回 UART。
    //
    MAP_UARTCharPutNonBlocking (UART0_BASE、MAP_UARTCharGetNonBlocking (UART0_BASE));

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

    我想我应该再复制一点、这样您就能知道它的来源。  这是我看到的、从第100行开始:

    //
    //
    //将字符串发送到 UART。
    //
    //
    空洞
    UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count)

    //
    //当有更多字符要发送时循环。
    //
    while (ui32Count --)

    //
    //将下一个字符写入 UART。
    //
    MAP_UARTCharPutNonBlocking (UART0_BASE、* pui8Buffer++);
    }
    }

    从第87行开始、我看到您发布的内容:

    //
    //当接收 FIFO 中存在字符时循环。
    //
    while (MAP_UARTCharsAvail (UART0_BASE))

    //
    //从 UART 读取下一个字符并将其写回 UART。
    //
    MAP_UARTCharPutNonBlocking (UART0_BASE、
    UARTCharGetNonBlocking (UART0_BASE);
    }

    因此、如果我正确理解上述内容、只要有要读取的字符、它就会获取这些字符、然后立即将它们发送出去。

    但在我的应用程序中、我要发送一条完整的新消息、这是对收到的消息的响应、而不是对收到的消息的回显。  该程序之前被设置为发送消息、并不断循环并等待消息完全发送、然后再继续执行程序的其他部分。  我想开始加载缓冲器、然后返回到缓冲器并继续加载、然后继续检查并最终关闭 RS485发送器。  这是我所做的,它似乎运作良好:

    //在这个函数中、我们已经成功地停止了循环和等待字符的传输
    if (character_to_send_hb)

    for (i = 0;i < 300;i++)//填充 FIFO 缓冲区

    if (must_reend_char_hb)
    GLOBAL_CHAR_HB = CHARGE_TO_RESTURE_HB;
    设计
    GLOBAL_CHAR_HB = GET_FROM_OUTPUT_BUFFER_HB ();

    如果(UARTCharPutNonBlocking (UartPort_HB、GLOBAL_CHAR_HB)== false)//字符在 FIFO 中没有进入、必须重试

    Character_TO_RESTURE_HB = GLOBAL_CHAR_HB;
    MUST_RESTURE_char_HB = true;
    休息;
    }
    设计

    MUST_RESTURE_char_HB = false;
    }

    if (out_wrptr_hb == out_rdptr_hb)

    HOST_1_HB_TRANSMISTION_FINED = true;
    Characters_to_send_HB = false;
    休息;
    }

    }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="345142" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1420221/tm4c129xnczad-any-sample-code-for-uartcharputnonblocking-using-interrupt-based-communication-instead-of-looping-to-wait-and-turn-off-rs485-transmitter/5446907 #5446907"]

    从第87行开始、我看到您发布的内容:

    //
    //当接收 FIFO 中存在字符时循环。
    //
    while (MAP_UARTCharsAvail (UART0_BASE))

    //
    //从 UART 读取下一个字符并将其写回 UART。
    //
    MAP_UARTCharPutNonBlocking (UART0_BASE、
    UARTCharGetNonBlocking (UART0_BASE);
    }

    [报价]

    这是回显接收到的内容的代码。

    //
    //
    //将字符串发送到 UART。
    //
    //
    空洞
    UARTSend (const uint8_t * pui8Buffer、uint32_t ui32Count)

    //
    //当有更多字符要发送时循环。
    //
    while (ui32Count --)

    //
    //将下一个字符写入 UART。
    //
    MAP_UARTCharPutNonBlocking (UART0_BASE、* pui8Buffer++);
    }
    }

    UARTSend 函数可向 UART 发送任意长度的字符。 您可以使用此函数根据您的应用程序发送您想要发送的任何内容。