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.

[参考译文] CC2640R2L:串行端口"部分返回"功能、关于返回方法的问题

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1320327/cc2640r2l-serial-port-partial-return-function-question-about-return-method

器件型号:CC2640R2L

大家好、

使用2640串行端口时、配置回调模式并开启部分返回函数以接收未定字符串、

通常、2640串行端口接收可作为数据包接收的字符串。

但是、当发送方发送的字符间延迟稍大时、2640接收将分包、这应该是由于部分返回功能。  

我想知道这个串行端口返回功能的默认时间是什么、以及它是如何配置的。

// Callback function
static void UartreadCallback(UART_Handle handle, void *rxBuf, size_t size)
{

    //UserUART_config[0].fxnTablePtr->writeFxn(Uarthandle,rxBuf,size);
    UartReceiveDataProcess(rxBuf,size);
    UserUART_config[0].fxnTablePtr->readFxn(Uarthandle,UserrxBuf,wantedRxBytes);

}


void UserUartInit(void)
{
    // Initialize the UART driver.
    UART_init();

    // Create a UART with data processing off.
    UART_Params_init(&Uartparams);                                //初始化是赋予一个默认值
    Uartparams.baudRate      = 9600;
    Uartparams.writeDataMode = UART_DATA_BINARY;                  //可以选择二进制格式还是10进制格式
    Uartparams.readMode      = UART_MODE_CALLBACK;
    Uartparams.readDataMode  = UART_DATA_BINARY;
    Uartparams.readCallback  = UartreadCallback;

    Uarthandle = UART_open(Board_UART0, &Uartparams);
    if (Uarthandle == NULL)
    {
        // UART_open() failed
        while (1)
            ;
    }
    UserUART_config[0].fxnTablePtr->controlFxn(Uarthandle, UARTCC26XX_CMD_RETURN_PARTIAL_ENABLE, NULL);

    wantedRxBytes = 100;
    UserUART_config[0].fxnTablePtr->readFxn(Uarthandle, UserrxBuf, wantedRxBytes);
}

此致、

银河

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

    您好 Galaxy:

    我希望你们做得好。 如果您需要测量程序的延迟、您可以将 GPIO 引脚(高/低)与逻辑分析仪配合使用、以便根据需要在程序中的特定点读取高电平和低电平。  

    -您是否正在使用 UART 从 PuTTY 等设备接收字符数据?  

    -您使用的 SDK 版本和基准示例是什么?  

    谢谢。
    A·F

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

    您好,Alex,ñ a

    另一个 MCU 用于通过计时器定期发送数据。

    SDK 版本为 simplelink_cc2640r2_sdk_1_40_00_45、基准测试示例为 simple_peripheral

    目的不是测量程序延迟、而是了解回调模式下串行端口"部分返回"的原理和详细信息、包括在什么条件下可以触发部分返回。 如果在特定时间段内没有数据、则会触发部分返回、那么如何配置该时间?

    现在遇到的问题是:将串行端口配置为回调模式并启用部分返回函数。 当接收到的字节之间的间隔小于4ms 时、这些字节将被视为数据包、并通过回调返回。 当接收到的字节之间的间隔大于5ms 时、这些字节中的每个字节都将触发独立回调并成为单独的字节。 我不希望这种现象发生。 我希望当每个字节之间的间隔小于10ms 时、可以将其视为数据包并返回。 ,如何实现?

    此致、

    银河

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

    您好 Galaxy:

    感谢您详细解释您的问题。 我想有几种方法可以实现解决方案、首先是使用某些 UART 参数、如 ReturnMode 字段、可以配置为在缓冲区已满或接收到换行符时执行回调。 这样、程序既可以等待缓冲区完成、也可以输入换行符。  

    如果您确实使用了 ReturnMode,则还需要更改 DataMode,如下所述。  

    可以使用信标和延迟来允许缓冲区接收更多数据。  

    谢谢。
    A·F

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

    您好,Alex F,  

    他需要使用回调模式、因为它是可变长度的数据、无法使用 return_full、数据是流数据、而不是文本、而且不能使用 new_Line。 他希望你集中在 他的问题:"返回到串行端口部分"功能的解释,部分退货的条件,调整部分退货持续时间",而不是转移问题。 他认为他的咨询是一个相当详细和明确的问题,如果你热衷于重构他的职能,他可以提交他的代码,请帮助他以其他方式实施。

    来自客户:

    问题应该是如何配置部分返回函数、这样<10ms 的数据就不会被子封装。 我希望通过调整部分返回函数来实现这个函数、因为我有理由使用回调模式和部分返回、所以请大家注意这个问题本身。

    此致、

    银河

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

    您好,Alex F,  

    来自客户:

    我找到了"部分返回超时机制"的描述如下(注意注释部分):

    /*!
     * @brief Command used by UART_control to enable partial return
     *
     * Enabling this command allows UART_read to return partial data if data
     * reception is inactive for a given 32-bit period.  With this command @b arg
     * is @a don't @a care and it returns UART_STATUS_SUCCESS.
     */
    #define UARTCC26XX_CMD_RETURN_PARTIAL_ENABLE    UART_CMD_RESERVED + 0

    在9600波特下、一位以0.104ms 传输、32个周期为3.32ms
    这与我当前的测试一致。
    现在我的问题是、可以修改或配置这个32位吗? 我想等待更长的时间。

    此致、

    银河

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

    您好 Galaxy:  

    32位非活动周期由硬件本身设置、因此用户不可修改。  

    https://e2e.ti.com/f/1/t/762686/

    您可以将 readTimeout 和 writeTimeout 配置为适用于您的用例、因为周期字段可以修改。 (请注意、  使用 UART_MODE_CALLBACK  模式时、不使用 UART_Params.readTimeout、因此您可能必须创建自己的回调/任务来处理数据。)  

    UARTCC26XX.h 文件参考(TI.com)

    谢谢。
    A·F

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

    您好,Alex F,

    感谢您的支持!

    这对我们很有用。

    谢谢~

    此致、

    银河