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.

[参考译文] CC3220MOD:TI UART 驱动程序-读取二进制数据时出现问题

Guru**** 2562840 points
Other Parts Discussed in Thread: CC3200, CC3200SDK

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/687856/cc3220mod-ti-uart-driver---issue-reading-binary-data

器件型号:CC3220MOD
Thread 中讨论的其他器件:CC3200CC3200SDK

大家好!

我在使用 TI 的 UART 驱动程序时遇到问题。 如本主题中所述:  

,为了在非 RTOS 应用程序中读取 UART 上的二进制数据,我们必须调用 缓冲区大小为1的 UART_READ()。 否则、我们无法检测数据包的末尾(因为 UART_READ 仅在缓冲区在二进制模式中已满时返回)。

这就是我们所做的。 但是、一旦传入的数据大于100字节(~1%)、我们就会遇到数据丢失。

我看到的唯一解决方案是直接访问 UART 寄存器并绕过 TI 的驱动程序。 有人以前做过吗? 是否有任何相关文档?

还有其他建议吗?

谢谢

Vincent Vuarnoz

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

    当您提到读取 UART 数据时的数据丢失时、这种情况是否在1%的时间内发生? 或者、它是否会丢失1%的数据、以及数据的哪一部分? 这是否始终可重现?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的奥斯汀:

    1%数据丢失。 我认为可以很容易地解释:记住它是一个非 RTOS 应用程序。 因此、我们在"UART 模块"中调用 UART_read (* size = 1)、并在回调函数触发时将值保存在缓冲区中。 但是、在下一次调用 UART_read()之前、应用程序可能会执行大量其他操作、因此我们可能会错过一个或两个字节...

    因此,您可以说:只需增大*大小! 问题在于:我们将无法检测不同大小的数据包。
    让我解释更多。 假设我们每秒接收大小不同的数据。 某些数据(最后一部分不适合我们的*大小的倍数)只会在有更多数据进入时才会被"读取",这是在1秒之后!!!

    一个很好的解决方案可能是在非阻塞模式下也使用"time-out"参数。 因此,当超时经过时,如果 UART 已接收到一些数据(如果长度<*大小),则会触发回调。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有任何关于这方面的新闻吗?
    您是否了解该问题?
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、奥斯汀、

    有任何有关这方面的新闻吗? 您正在调查中吗? 您看到我的意思吗?
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    伙计们?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Vincent:

    此主题似乎说明了如何实施您提出的解决方案:

    e2e.ti.com/.../287923

    您能否尝试一下、看看这是否能解决您的问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的奥斯汀:

    否! 超时仅适用于阻塞模式...

    这正是我的建议。 要为回调模式添加此超时!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否看到我的帖子?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我认为简单的方法是使用 driverlib 而不是 TI 驱动程序。 在 e2e 论坛上搜索"CC3200 UART 中断"。 CC3220的 Driverlib 与 CC3200相同。

    1月
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Hnz。 这正是我一直在寻找的!!!

    我开始实施、可以看到 RX INT 有2种类型。 一个基于 FIFO 深度、另一个基于超时。
    超时值是多少? 是否可以设置自定义值?

    与 Doxygen 文档相比、driverlib 实现是否有更多可用的文档?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请阅读 TRM ( www.ti.com/lit/ug/swru465/swru465.pdf )第6.2.3.3章,其中说明:

    "当接收 FIFO 不为空且没有更多数据时、接收超时中断有效

    HSE 位清零时在32位周期内接收、HSE 位置位时在64位周期内接收。

    当 FIFO 通过读取所有数据变为空时、接收超时中断被清除

    (或通过读取保存寄存器)、或向 UARTICR 中的相应位写入1

    寄存器。"

    如果您需要有关 drivelib 的说明、请安装 CC3200 SDK、并在其中找到文件\CC3200SDK_1.3.0\cc3200-sdk\docs\CC3200-Peripheral_Driver_Library_User's _Guide.ch 此文件包含 driverlib 的说明。 但信息可能与 doxygen 文档中的信息相同。

    我个人在 CC3220项目中使用 drivelib、因为 drivelib 比 TI 驱动程序灵活得多。

    1月

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