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.

[参考译文] LAUNCHXL-CC3235SF:使用 UART2_Mode_callback 时 CC3235SF 上出现 UART2 部分接收问题

Guru**** 2468610 points
Other Parts Discussed in Thread: CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1533826/launchxl-cc3235sf-uart2-partial-receive-issue-on-cc3235sf-using-uart2_mode_callback

器件型号:LAUNCHXL-CC3235SF
Thread 中讨论的其他器件:CC3235SF

工具/软件:

  • 您好:

    我目前正在开发 CC3235SF 使用了 SimpleLink SDK 版本 7.10.00.13 和定制板。
    我遇到了问题 UART2 接收行为 使用UART2_Mode_CALLBACK和时UART2_ReadReturnMode_PARTIAL

    问题描述

    • 我正在收到的消息 UART 数据不完整 在通过 Modbus RTU 协议与从设备通信期间。

    • 我已经通过示波器确认了 Rx 波形已完成 、但是 我的固件仅接收部分数据 (例如,只有较长响应的前几个字节)。

    • 就会出现问题 一致 收到多个帧时发出的命令。

    系统设置程序

    • MCU:CC3235SF

    • SDK:simplelink_cc32xx_sdk_7_10_00_13

    • UART 模式: UART2_Mode_CALLBACK

    • 波特率:115200

    • 读取返回模式: UART2_ReadReturnMode_PARTIAL

    • 无流控制(仅限 Rx / Tx)

    • 回调重新启动对完整缓冲区(256 字节)的读取

    代码概述

    在我的回叫中:

    #define UART_RX_BUFFER_SIZE 256
    static uint8_t rxBuffer[UART_RX_BUFFER_SIZE];
    static UART2_Handle uart2Handle;
    static volatile size_t rxBytesReceived = 0;
    
    
    void UART2_readCallback(UART2_Handle handle, void *buf, size_t count, void *userArg, int_fast16_t status)
    {
        if (status == UART2_STATUS_SUCCESS) {
            if ((rxBytesReceived + count) <= UART_RX_BUFFER_SIZE) {
                memcpy(&rxBuffer[rxBytesReceived], buf, count);
                rxBytesReceived += count;
            }
        }
        /* Re-initiate the read to continuously receive data */
        UART2_read(handle, rxBuffer, UART_RX_BUFFER_SIZE, NULL);
    }
    
    size_t UART_getRxData(uint8_t *buffer, size_t bufferSize)
    {
        size_t bytesToCopy = 0;
        if (rxBytesReceived > 0 && buffer != NULL) {
            bytesToCopy = (rxBytesReceived < bufferSize) ? rxBytesReceived : bufferSize;
            memcpy(buffer, rxBuffer, bytesToCopy);
            rxBytesReceived = 0;
            memset(rxBuffer, 0, UART_RX_BUFFER_SIZE);
        }
        return bytesToCopy;
    }
    
    void uartRxInit(void)
    {
        UART2_Params uart2Params;
        int_fast16_t status;
    
        /* Configure UART2 parameters */
        UART2_Params_init(&uart2Params);
        uart2Params.baudRate = 115200;
        uart2Params.readMode = UART2_Mode_CALLBACK;
        uart2Params.writeMode = UART2_Mode_BLOCKING;
        uart2Params.readCallback = UART2_readCallback;
        uart2Params.readReturnMode = UART2_ReadReturnMode_PARTIAL; /* Allow partial reads with timeout */
        uart2Params.userArg = NULL; /* No user argument needed for this example */
    
        /* Open UART2 */
        uart2Handle = UART2_open(CONFIG_UART2_1, &uart2Params);
    
        if (uart2Handle == NULL) {
            /* UART2_open() failed */
            UART_PRINT("Error: UART2_open failed for CONFIG_UART2_1\r\n");
            while (1);
        }
    
        UART_PRINT("UART2 Initialized on CONFIG_UART2_1 (Callback Mode)...\r\n");
    
        /* Initiate the first read operation */
        status = UART2_read(uart2Handle, rxBuffer, UART_RX_BUFFER_SIZE, NULL);
        if (status != UART2_STATUS_SUCCESS) {
            UART_PRINT("Error: Initial UART2_read failed! Status: %d\r\n", status);
        }
    }
    • 回调接收 Modbus RTU 数据包的部分块。

    • 在主线程中、我检查rxBytesReceived > 0并复制数据。 但当需要 20–30 时、通常仅接收 5–10 个字节。

    • 我还尝试在回调中使用 1 字节读取、结果相同。

    我已验证的事项:

    • UART RX 信号存在于引脚上且是干净的。

    • 触发回调。

    • Rx 缓冲区未满(256 字节、Modbus 数据包<64 字节)。

    • 没有内存损坏或任务耗尽。

    问题:

    1. UART2_ReadReturnMode_PARTIAL未返回所有可用数据是否存在任何已知问题?

    2. 每次在回调中重新发出完整的缓冲区读取(256 字节)是否正确?

    3. 是否可以在两次读取之间发生数据丢失、或者 UART 驱动程序是否应该在内部处理队列?

    4. 您是否有使用可靠地接收完整 Modbus RTU 帧的建议UART2_Mode_CALLBACK?

    感谢您的支持

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

    您好、Ryan、

    感谢您分享代码片段和详细信息。 您是否可以在 UART2_readCallback () 中尝试此操作?  

    而不仅仅是检查状态“if (status == UART2_STATUS_SUCCESS)“

    尝试:“if ((status == UART2_STATUS_SUCCESS)&&(count >0))“


    “UART2_ReadReturnMode_Partial"模式“模式没有已知问题。 实际上、这是 UART2 的默认参数。