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.

[参考译文] LP-EM-CC1354P10:向 Wi-SUN CoAP 项目添加 UART 中断

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1415402/lp-em-cc1354p10-adding-uart-interruption-to-wi-sun-coap-project

器件型号:LP-EM-CC1354P10
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我将使用 ns_CoAP_node 示例、我想实施 UART 中断、这样该节点便可处理接收到的一些数据、并使用 CoAP 将其发送至边界路由器。 我已经尝试通过以下步骤修改原始代码:

在 SysConfig 中添加了 UART 外设:

在 application.c 中实现了回调函数:

在 application.c 中的 mainThread 中初始化 UART:

当我调试代码时、虽然 UART 外设中未接收到任何内容、但代码会继续按预期运行。 当我向 UART 写入某些内容、然后暂停运行的工程时、我可以看到它卡在这个 while (1)循环中:

这是应该发生的事情吗? 我想它会进入 UART 回调函数、然后继续照常运行。

此致、
Eduardo。

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

    Eduardo、您好!

    在回调中、您无法在阻塞模式下读取或写入。
    您可以在 UART2.h 文件中查看模式:

    如果将模式更改为"uartParams.writeMode = UART2_Mode_nonblocking;"、您的代码将使用 FNE。

    此致、
    等等

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

    尊敬的 Theo:

    我将 SYSCFG 中的写入模式更改为非阻塞模式并启用了非阻塞模式。 我还稍微更改了代码、并且我不再使用回调功能进行其他一些测试。 现在、我将尝试在按下按钮时调用的函数中写入 UART。 我在做什么:

    UART2_handle uart_esp;
    UART2_Params uartParams;
    size_t bytesWriten = 0;

    我使用逻辑分析仪、似乎只有一部分消息已发送:

    缺少某些字符。 我曾尝试切换到阻塞模式、它最多输出16个字节而不是11个字节、但仍然无法写入整个消息。

    是否有我缺少的配置导致此错误?

    此致、
    Eduardo。

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

    尊敬的 Theo:

    谢谢、设置延迟可以解决这个问题。 现在、我能够在按下按钮时成功地将整个消息写入 UART。

    我当时正在再次测试 UART 回调函数、想知道是否有任何关于关心 UART 回调函数大小的建议。 我打算使用回调函数解析通过 UART 接收到的消息、并根据接收到的内容执行某些函数。

    您觉得这样做有什么问题吗?

    此致、
    Eduardo。

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

    Eduardo、您好!

    这样做是没有问题的。  

    一般情况下建议尽可能缩短处理时间、并且您可以创建一个单独的 UART 线程、以打开 UART、然后处理与之相关的所有处理。 这样、您就可以使 UART 永久打开(因此不需要延迟)。

    此致、
    等等

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

    尊敬的 Theo:

    感谢您的支持、一切似乎都很顺利!

    此致、
    Eduardo。

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

    尊敬的 Theo:

    实际上,如果你能帮助我再做一件事,我将不胜感激。

    我将使用第二个 Thread 来接收 UART 消息、正如您建议的:

    回调函数如下:

    我正在发送一些数据包、但好像我没有收到全部数据包。

    如您所见、I echo bach 到 UART 回调函数在第1244行上接收到的数据包。 可以看到、它似乎只是接收前4个字节、缺少数据包的其余部分。

    如何才能正确接收整个数据包?

    此致、
    Eduardo。

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

    最新动态:

    我刚才发现、切换 UART2_write 参数可输出整个数据包:
    UART2_write (handle、data、count、&bytesWritten1)、而非 UART2_write (handle、data、sizeof (data)、&bytesWritten1)。

    为什么会发生这种情况?

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

    Eduardo、您好!

    我无法在您的片段中找到计数的定义。 您能解释一下为 count 传递哪个值、以便我可以理解 count 和 sizeof (data)之间的区别吗?

    此致、
    等等

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

    尊敬的 Theo:

    count 是 uartRxCallback 函数的参数。 我想这是已在 UART 中读取的消息的大小。

    只是为了向您展示整个函数:

    解析接收到的消息后、我再次调用 UART2_Read、否则无法接收多个消息、并将计数作为接收缓冲区的参数传递。

    此致、
    Eduardo。

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

    Eduardo、您好!

    再次看看您的实现、我看到当您使用 sizeof (data)时、您实际上将指针的大小替换为32位的存储器地址的大小。 这就是您仅接收到4个字节的原因。

    而 count 参数是接收的字节数、当您再次发送所有数据时、字节数是匹配的。

    我想为您的实施提供一些一般性建议:
    -你不应该执行一个巨大的过程在回调,特别是没有睡眠。
    -最佳实践您只需在回调中设置一个信标,然后在回调之外进行所有处理。 可以查看 RTOS 调度和与之相关的信标。

    此致、
    等等