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.

[参考译文] LAUNCHCC3220MODASF:CC3220、使用 UART 读取超时、是否有中断模板?

Guru**** 2595805 points
Other Parts Discussed in Thread: CC3220SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/834235/launchcc3220modasf-cc3220-using-uart-read-timeout-is-there-an-interrupt-template

器件型号:LAUNCHCC3220MODASF
主题中讨论的其他器件:CC3220SF

我们有一款具有 CC3220 WiFi 模块的产品、它从 UART1发送数据、然后等待响应。

我的前任编写了一些代码、这些代码读取 UART、但会在没有响应时阻止并且不返回(UART_readPolling (uart1Handle、&cChar、1);       //获取下一个字符)。

当然、在现实世界中、另一个控制器(MSP430)将响应写回 CC3220可能无法发送响应。 (现实世界是每40、000个通信事件中有1个事件、或1个事件太多)。

我实现了一个从 CC3220到另一个控制器的写入、而另一个控制器对此没有响应。 这让我可以轻松地重复阻止读取的情况。

我希望我可以将读取超时 时间从 readTimeout = UART_WAIT_FOREVER 设置为如下所示的值:

 uartParams.readTimeout     = 10;  // FLE 猜测在 MS 中的某个超时。 20190827

它将返回 NULL 作为字符、甚至是最后一个字符。  但是、当我运行代码时、它仍然滞留在等待 UART 读取数据上。  读取 SWRU465第6.2.3.3节我不清楚在超时发生时等待 UART 读取的代码上的程序流会发生什么情况。 我看到有关 ISR 的指令、可能需要执行这些指令来清除标志、以便 UART_readPolling 上的程序流将恢复。

我很幸运地搜索了 SDK 中的 UART ISR 示例。 因此、我不确定从哪里开始。
希望获得此类 UART ISR 的示例或概述。 我从未为 ISR 编写过 TI 代码、而且模板/示例面临着陡峭的学习曲线。  供参考、我使用 CCS8已有一年了、现在我从未有过原因、也从未学习过如何检查寄存器中的中断状态位。

谢谢、

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

    假设 在等待 UART 读取时、程序计数器在三个地址 lop 中的屏幕截图。

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

    接收 UART 字符的函数。

    //
    //
    //接收来自 UART1 (RS485)的字符并将其写入全局录制缓冲器
    //还将字符回显到调试 UART
    //让 TP216在 WiFi 传输 RS485 UART 数据 FLE 20190827时变为高电
    平//让 TP217在 WiFi 等待接收 RS485 UART 时变为高电平 数据。
    ////
    *****************
    void RS485Recv (void)
    {
    char cChar;
    
    gUARTRecBufIndex = 0;
    memset ((char *) gUARTRecBuf、0、sizeof ((char *) gUARTRecBuf));
    
    GPIO_WRITE (CC3220SF_LAUNCHXL_GPIO_TP217.1);//用于检测 RS485总线流量。
    UART_readPolling (uart1Handle、&cChar、1);
    GPIO_WRITE (CC3220SF_LAUNCHXL_GPIO_TP2170);
    
    while (1)
    {
    if ((cChar ='\r\n')||(cChar =='\n')) //检查命令结束
    {
    UART_writePolling (uartHandle、&cChar、1);//将接收到的字符回显到调试 UART
    gUARTRecBuf[gUARTRecBufIndex++]= cChar; //并将字符存储在缓冲区中
    中断;
    }
    其他
    {
    UART_writePolling (uartHandle、&cChar、1);//将接收到的字符回显到调试 UART
    // *(pcBuffer + iLen)= cChar;
    gUARTRecBuf[gUARTRecBufIndex++]= cChar;//并将字符存储在缓冲
    区中}
    
    GPIO_WRITE (CC3220SF_LAUNCHXL_GPIO_TP217.1);//用于检测 RS485总线流量。
    UART_readPolling (uart1Handle、&cChar、1); //获取下一个字符
    GPIO_WRITE (CC3220SF_LAUNCHXL_GPIO_TP2170);
    } // while (1)
    
    //*(pcBuffer + iLen)='\0';
    
    // uart_print ("\r\n");
    gUARTRecBuf[gUARTRecBufIndex++]='\0'; //在缓冲区中放置字符串终结器
    // uart_print ("RS485Recv: end \r\n");
    } 

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

    我们的 UART 初始化。

    UART0是调试 UART。

    UART1是我们的 RS485总线、与 MSP430进行半双工通信。

    //
    //
    //! 初始化
    //!
    //! 此函数
    //! 配置要使用的 UART。
    //!
    //! \param none
    //!
    //! 返回无
    //
    ////*********
    UART_Handle InitTerm (void)
    {
    
    UART_ParamsuartParams;
    
    UART_INIT();
    UART_PARAMS_INIT (uartParams);
    
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudrate = 115200;
    
    uartHandle = UART_OPEN (Board_UART0、uartParams);
    /*从 LPDS 依赖项中删除 UART 接收*/
    UART_CONTROL (uartHandle、UART_CMD_RXDISABLE、空);
    
    uartParams.readTimeout = 10;//在 MS 中的某个超时 FLE 猜测。 20190827
    uart1Handle = UART_OPEN (Board_UART1、&uartParams); // GAA 30Aug2018
    /*从 LPDS 依赖项中删除 UART 接收*/
    UART_CONTROL (uart1Handle、UART_CMD_RXDISABLE、空); // GAA 30Aug2018
    
    return (uartHandle);
    } 

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

    您好、Lee、

    使用轮询读取/写入是否有具体原因? 这些效率低下。 SDK 的 drivers 文件夹中有一个名为 uartecho 的 UART 示例。 非常简单的示例、该示例仅重复使用阻止 UART 调用(UART_READ/WRITE)而不是轮询发出的内容。 您还可以 在此处了解有关我们的 UART 驱动程序的更多信息。  

    Jesu

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

    Jesu、

    感谢您回来。

    关于"是否有使用轮询读取/写入的具体原因?"  否 我只是继承了这一遗产(一旦我理解了它、我就认为这是一个问题)、并希望通过重新发明车轮来变得更加智能。 我当时假设我可以让 UART 在一段时间后放弃、我可以测试 NULL 或其他值、并向控制程序报告结果。

    我将查看"SDK 命名为 uartecho"、并尝试变得更智能。 (我在以下位置找到:C:\ti\simplelink_cc32xx_sdk_3_20_00_06\examples\rtos\CC3220SF_LAUNCHXL_drivers\uartecho)

    1000谢谢、如果我无法从"SDK 命名为 uartecho"中了解如何操作、我会将此问题标记为已解决并开始新问题。