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.

[参考译文] CC2340R5:发生了 UART 溢出事件

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1345246/cc2340r5-uart-overrun-event-has-occurring

器件型号:CC2340R5
主题中讨论的其他器件: CC2640R2F

您好!

   我将 CC2340R5 based_ble 外设 代码与 ANCS 一起使用、并已  按如下所示添加 UART 代码。

void UART_Init()
{

    /* Create a UART in CALLBACK read mode */
    UART2_Params_init(&uartParams);
    uartParams.readMode = UART2_Mode_CALLBACK;
    uartParams.readCallback = UARTCallback;
    uartParams.readReturnMode = UART2_ReadReturnMode_PARTIAL;
    uartParams.baudRate = 115200;
    uartParams.eventCallback = UARTEventCallback;
    uartParams.eventMask = UART2_EVENT_OVERRUN;
    uart = UART2_open(CONFIG_UART2_0, &uartParams);

    if (uart == NULL)
    {
        /* UART2_open() failed */
        while (1)
        {
        }
    }
    // Setup an initial read
     UART2_read(uart, &uartReadBuffer, UART_MAX_READ_SIZE, 0);

}
void eventcallbackFxn(UART2_Handle handle, uint32_t event, uint32_t data, void *userArg)
{
    if (event == UART2_EVENT_OVERRUN) //check if the event is overrun event 
    {
		UART2_flushRx(uart);
    }
}
void UARTCallback(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
{
    uartPacketSize = count;
    BLEAppUtil_invokeFunction(HandlingFunction,buffer);
}

void HandlingFunction(char *pData)
{
    UART2_write(uart,pData,uartPacketSize,0);
    UART2_read(uart, uartReadBuffer, UART_MAX_READ_SIZE, 0);
}

现在、iPhone 已连接到外设并进行连续通话和短信(信息将在 UART 上打印) 、同时 在移动蓝牙设置中进行连接断开。   在   发生这些测试用例 UART 溢出事件时、以100ms 的间隔通过串行向外设推送数据。

当超限发生在  事件调用 backFxn  呼叫   UART2_flushRx (UART) 功能和 5秒后  HAL_ASSERT_LAY_ICALL_TIMEOUT。

那么如何避免 UART 溢出、以及为什么 UART2_flushRx (UART) 函数导致 HAL_ASSERT_LAY_ICALL_TIMEOUT。

SDK 版本: simplelink_lowpower_f3_sdk_7_40_00_64 (外设)

CCS 版本:CCS 12.5.0

谢谢。

Vignesh。

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

    尊敬的 Vignesh:

    感谢您与我们联系。

    当 CPU 没有足够的时间在下一个数据块到达之前读取 UART 缓冲区的内容时、会发生溢出错误。
    我建议尝试增加 RX 环形缓冲区的大小、看看它是否有帮助。 我建议 RX 环缓冲区至少大于预期接收的 UART 消息。 下面的屏幕截图显示了具体操作方法:

    此外、我建议参考 UART2示例概要: https://software-dl.ti.com/simplelink/esd/simplelink_lowpower_f3_sdk/7.40.00.64/exports/docs/drivers/doxygen/html/_u_a_r_t2_8h.html#ti_drivers_UART2_Synopsis
    如果尚未完成,请尝试 在 UART2_read()之前调用 UART2_rxEnable。

    关于 HAL_ASSERT_FROM_ICALL_TIMEOUT,我认为是由于执行 UART2_flushRx ()来禁用超过 BLEStack 所接受的中断导致的。

    我希望这将有所帮助、

    此致、

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

    您好、Clement、

    我建议尝试增加 RX 环缓冲区的大小以查看是否有所帮助。 我建议 RX 环缓冲区至少大于预期接收的 UART 消息。 [/报价]

    我已经尝试增加  大于 UART 消息(20字节)的 RX 环缓冲区的大小(超过32、64,300,1024)、并    在以100ms 的 UART 溢出间隔发送20个字节的数据时、仍然在 UART _Init ()中调用 UART2_rxEnable 函数。

    谢谢。

    Vignesh。

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

    尊敬的 Vignesh

    谢谢您告诉我。

    在您共享的代码中、UART_MAX_READ_SIZE 的值是什么? 您能否确保它仅为20个字节(由于 UART 消息的大小)。

    如果前一个命令不起作用、您能否在接收到读回调函数后尝试取消读操作? 为此、您可以考虑在 UARTCallback 函数中调用 UART2_readCancel 函数。

    此致、

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

    您好、Clement、

        UART_MAX_READ_SIZE 的值为300。

     我已尝试 调用 UART2_readCancel 函数 UARTCallback 函数 UART 溢出问题、到目前为止尚未观察到。

    但如果 以100ms 的间隔发送20个字节的数据、则 在与移动设备配对时会发生 UART 溢出。

    谢谢。

    Vignesh。

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

    尊敬的 Vignesh

    很高兴看到有一些进展。

    配对操作需要复杂的计算才能生成加密密钥。 如前所述、这会给 CPU 留下很少的处理能力、从而可以解释观察到的问题。

    此致、

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

    您好、Clement、

         一个100ms 的间隔时间、通过  UART 将数据(大约20字节)连续推 送到 外设。 现在、我 已 在链路层将移动设备与外围设备连接起来  。在尝试进行配对时、我可以  成功地与外围设备配对(只需工作)。 但正在发生 UART 溢出。  

    我们在 CC2640R2F 中没有遇到这些问题、但在 CC2340R5中。您能提供任何解决方案来防止配对时发生 UART 溢出吗?

    谢谢。

    Vignesh。

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

    尊敬的 Vignesh

    您能否指导我们重现 basic_ble 示例中的相同内容(即没有 ANCS 代码)?

    在本例中、您是否在与 ANC 相同的线程中运行 UART 操作?

    此致、

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

    您好、Clement、  

       借助基本的 ble 示例、可以通过添加 UART 来重现问题、其中首先提供的代码和 在 UART 中连续发送数据、现在会发生 UART 过载配对。  

    对于具有 ANC 的基本通信量外设、发生 UART 溢出时外设 Rx 不工作。  

    可以、UART 操作在与 ANC 相同的线程中运行。

    您能指导我在不同的线程中实现 UART 吗?  

    谢谢。  

    Vignesh。  

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

    尊敬的 Vignesh:

    您可以在 将"驱动程序"示例合并到 basic_ble SLA 中找到有关在不同线程中实现 UART的所有信息。

    希望这对您有所帮助、

    丹桂语

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

    您好、Clement、

        我们已尝试 在不同的线程中实现 UART、但没有帮助防止发生 UART 溢出事件。

    在我们开始分析 UART 初始化并 在那里启用读取回调后、我们发现 BLEAppUtil_invokeFunction 导致了 UART 溢出事件。

    您能否尝试 通过 在读回调中添加 BLEAppUtil_invokeFunction 重新创建问题、并在 UART 上发送延迟为100ms 的数据  、然后尝试配对、然后将发生 UART 溢出。

    谢谢。

    Vignesh。

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

    尊敬的 Vignesh:

    使用 BLEAppUtil_invokeFunction 发送到函数的数据需要使用 BLEAppUtil_malloc 进行分配,是否可以使用以下 UARTCallback 重试?

    #include <ti/bleapp/ble_app_util/inc/bleapputil_internal.h>
    void UARTCallback(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
    {
        uartPacketSize = count;
        void *data = BLEAppUtil_malloc(count);
        memcpy(data, buffer, count);
        BLEAppUtil_invokeFunction(HandlingFunction, data);
    }
    

    如果此操作修复了 UART 溢出、请告知我。

    此致

    丹桂语

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

    您好!

      我已经尝试 在 UARTCallback 函数中分配 BLEAppUtil_malloc、但仍然发生溢出。

    谢谢。

    Vignesh。

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

    尊敬的 Vignesh:

    我通过执行以下操作设法重现此问题:

    1. 我导入了 basic_ble 项目
    2. 我添加了您在 app_main.c 中提供的函数
      1. I 将 UART_MAX_READ_SIZE 定义为32
      2. uartReadBuffer 是 UART_MAX_READ_SIZE 字节的数组。
    3. 我在中的 Menu_start 之前调用 UART_init App_Stack 在线维修手册
    4. 我 使用以下 python 脚本来将数据发送到器件
      import serial
      import time
      
      ser = serial.Serial ("COM8", 115200)
      while True:
          time.sleep(0.1)
          ser.write(b'a' * 32)
          print(ser.read_all())
      
    5. 在我的手机上、我已连接到器件、并尝试在使用 python 脚本来发送数据的同时读取特征0xFFF5。
    6. 我观察到 UART 溢出错误

    在我的测试过程中、我注意到配对开始时、两次调用 HandlingFunction 之间的间隔大约为500ms。 所以、我将 RX 环形缓冲区的大小增加到了192个字节(32 x 6)、并且 UART 溢出错误消失了。

    此致、

    丹桂语

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

    您好、Tanguy:

      我将 UART_MAX_READ_SIZE 定义为300。 因此我增加了 RX 环缓冲区1800 (300x6) 的大小、但 UART 溢出错误尚未发生。

    但是在使用多角色配置文件和 ANC 时、RAM 消耗增加到了98%、并且还需要实施 AMS。  您可以建议任何其他解决方案来防止 UART 超限错误吗?

    谢谢。

    Vignesh。   

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

    您好,Vignesh

    我很高兴听到增大缓冲区的大小可以解决溢出错误。 关于内存使用情况、你可以尝试使用一个较小的缓冲区(x4、x5)、也许足以避免溢出。 避免该问题的其他方法是减少发送的字节数或增加2次传输之间的间隔。

    关于内存使用情况、您能否告诉我在增加缓冲区大小之前的总内存消耗是多少?

    为了减少 RAM 用量、你可以在 ROV 中检查最大堆用量并相应地减少堆。

    此致、

    丹桂语