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.

[参考译文] CC1312R7:UART2回调模式下的回调不包含所有字节

Guru**** 2482105 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1275776/cc1312r7-callback-in-uart2-callbackmode-not-containing-all-bytes

器件型号:CC1312R7

当修改 uart2callback 示例以接收多个 char 时、即使在 UART 缓冲区中接收到数据、也并不总是获得回调。

我在接收到第一个数据时得到一个回调、但当我 再次调用 UART2_READ 时、我没有获得剩余数据的任何回调。

何时调用回调?

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

    如果不知道您对示例所做的确切更改、就很难解释您看到了什么。

    我举个例子、改变了  

    状态= UART2_READ (UART、&INPUT、1、NULL);

    状态= UART2_READ (UART、&INPUT、3、NULL);

    应用的行为没有改变、而且我在终端程序中键入的每个字节仍然可以进行1次回调。

    这正如预期的那样、因为默认情况下、  

    uartParams.readReturnMode = UART2_ReadReturnMode_partial;// 当没有新数据输入时进行回调

    正在设置

    uartParams.readReturnMode =  UART2_ReadReturnMode_Full;

    将导致在生成回调之前必须输入3个字节。

    Br

    Siri

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

    I 在运行时使用 uartParams.readReturnMode = UART2_ReadReturnMode_Partial。

    在执行3个字节读取和4个字节发送操作时、我希望在执行第二个 UART2_READ 时进行新的回调、因为已经接收到数据。 相反、在收到新内容并生成新回调之前、我不会获取该数据。

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

    我做了以下测试、我想我会看到您描述的问题:

    UART2_Params_init(&uartParams);
    uartParams.readMode       = UART2_Mode_CALLBACK;
    uartParams.readCallback   = callbackFxn;
    uartParams.baudRate       = 115200;
    uartParams.readReturnMode =  UART2_ReadReturnMode_PARTIAL;
    
    UART2_open(CONFIG_UART2_0, &uartParams);
    
    while (1)
    {
        numBytesRead = 0;
    
        UART2_read(uart, &input, 3, NULL);
        sem_wait(&sem);
    
        if (numBytesRead > 0)
        {
            UART2_write(uart, &input, numBytesRead, NULL);
        }
    }
    
    void callbackFxn(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
    {
        if (status != UART2_STATUS_SUCCESS)
        {
            /* RX error occured in UART2_read() */
            while (1) {}
        }
    
        numBytesRead = count;
        interrupts++;
        sem_post(&sem);
    }
    

    假设我在等待信号量后运行代码并设置断点。

    ‘输入一个单个字符'A'、由于 readReturnMode = UART2_ReadReturnMode_partial、我将获得回调 

    ‘A’存储在输入中,然后打印回。

    ‘我然后在"CHAR"之前输入第二个"CHAR" UART2_READ 被‘、'DB'被存储在输入中、但是不生成新的回调。

    这是在‘第三个 char 'C'被输入前不会发生的。  

    我向研发团队咨询并得到了以下反馈:

    "这是一个非常特殊的边缘情形,对于代码目前的编写方式是可以预料的。 以部分模式从 UART2_READ 返回的条件是

    a)所有请求的字节均可用、或

    b)接收到一些字节、然后发生超时。

    但是,驱动程序仅检查这些条件* 之后 *对 UART2_READ 的调用,意味着过去发生的超时无效。

    该驱动程序从内部环缓冲器(char‘B')读取可以读取的值、然后开始等待返回条件变为真。

    有多种方法可以解决这个问题、

    • 一次读取1个字节(如果已将一个字节读入环缓冲区、该函数将返回/调用回调)
    • ‘读取操作(然后、将使用输入缓冲区中的"SAFETY_FUNC_CFG 寄存器"调用回调函数)

     第一种方法是最初以何种方式编写示例。

    我测试了方法2、 在按下按钮时调用了 UART2_readCancel。

    如果我在上面的测试用例中执行此操作、在环形缓冲器中收到 B 后、我会得到回调函数、并打印 B。

    对于该"解决方案"、  除了 UART2_STATUS_SUCCESS 之外、您还需要修改回调以检查 UART2_STATUS_ECANCELED  

    Br

    Siri

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

    这是我看到的问题。

    在实现中、我将 UART 用于与调制解调器通信、此"边沿便携包"始终可用。
    一次读取一个字节将会极大地限制吞吐量、并且会产生一个回调/字节的巨大开销。
    取消读取操作主要是轮询 UART、我看不到使用 UART2_Mode_callback 而不是 UART2_Mode_Blocking 的增益。

    对于如何以非阻塞的方式读取未知数量的数据、您有什么建议吗?

    Br、

    Håkan

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

    您好 Håkan

    如果您正在使用我们的驱动程序、除了我已经发布的解决方案、恐怕我看不到任何其他解决方案。  

    Br

    Siri