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.
工具与软件:
在 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 已满的情况。
上述代码来自哪里? 我在 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;
休息;
}
}
}
从第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 发送任意长度的字符。 您可以使用此函数根据您的应用程序发送您想要发送的任何内容。