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.

[参考译文] CCS/LP-CC2652RB:如何接收变量中的 UART 输入?

Guru**** 2559730 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/946369/ccs-lp-cc2652rb-how-to-receive-uart-input-into-a-variable

器件型号:LP-CC2652RB

工具/软件:Code Composer Studio

如何使用 system_printf ()将数据从 UART 显示到控制台中;命令。 我能否将 UART 数据接收到变量中?  

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

    您在2652上使用的是什么操作系统?

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

    Shivam、

    我建议查看 UART 回波示例、了解如何对 UART 进行读取和写入。

    https://dev.ti.com/tirex/explore/node?node=AE5vt5FbesOc0NdnkcpdSw__pTTHBmu__LATEST  

    此外还有一个 SimpleLink Academy 培训,内容涉及各种调试打印方法,包括 system_printf(),网址 为:https://dev.ti.com/tirex/explore/node?node=ANqagjxZxWnBRB7bx0EnOw__pTTHBmu__LATEST 

    此致、

    Daniel

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

    我在 CCS IDE 中使用 UART echo 示例中的 Notos 代码。

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

    Shivam、

    System_printf()需要 TI-RTOS。  https://dev.ti.com/tirex/explore/content/simplelink_academy_cc13x2_26x2sdk_4_20_03_00/modules/debug/debugging_output/debugging_output.html#system_printf 

    此致、

    Daniel

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

    好的,谢谢 Daniel,我能否将 UART 数据接收到字符或字符串变量中,并将其传递给 systemprintf()

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

    因为 UART_READ 和 UART_WRITE 函数具有 int 类型返回值。 如何将 UART_READ 读取的值传递到 system_printf()中。

    提前感谢。

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

    Shivam、

    请参阅以下驱动程序文档: https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_4_20_01_04/docs/tidrivers/doxygen/html/_u_a_r_t_8h.html#a15d77f489566ff9f7c9c28d25e9a0135 

    UART_READ()将数据放入缓冲区。  

    参数
    句柄由 UART_open()
    缓冲区返回的 UART_Handle指向应向其写入接收数据的空缓冲区的指针
    大小要写入缓冲区的字节数
    
    返回
    已从 UART 读取的字节数,UART_STATUS_ERROR 在出错时返回。 

    此致、

    Daniel

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

    好的,谢谢 Daniel,所以你可以说我可以使用这个缓冲区传递到 system_printf()。
    是否可以使用 system_printf (&buffer)。

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

    Shivam、

    请阅读 system_pintf()的文档。 您需要传递字符串、因此需要将缓冲区从字符数组转换为字符串。

    https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_4_20_01_04/docs/tirtos/sysbios/docs/cdoc/index.html#xdc/runtime/System.html#printf

    Daniel

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

    好的、非常感谢 Daniel、您能告诉我们我如何访问该缓冲区、至于如何将字符转换为字符串、我可以进行类型转换。

    提前感谢。  

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

    Shivam、

    请参阅我之前链接的示例,其中显示了如何使用缓冲区来存储从 UART_READ()接收到的字符。

    您还可以在以下文档中看到代码示例: https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_4_20_01_04/docs/tidrivers/doxygen/html/_u_a_r_t_8h.html 

    此致、

    Daniel

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

    好的、谢谢。 因此、我可以如下所示对代码进行以下更改。

    //导入 UART 驱动程序定义
    #include 
    // UART 驱动程序 UART_INIT (
    )的一次性初始化;
    //初始化 UART 参数
    UART_PARAMS 参数;
    UART_PARAMS_INIT (&params);
    params.baudrate = 9600;
    params.readMode = UART_MODE_BLOCKING;
    params.writeMode = UART_MODE_BLOCKING;
    params.readTimeout = UART_WAIT_FOREVE;
    params.writeTimeout = UART_WAIT_FOREVE;
    //打开 UART
    UART_Handle UART;
    UART = UART_OPEN (CONFIG_UART0、&params);
    //从 UART
    Int32_t ReadCount 读取;
    uint8_t buffer[BUFSIZE];
    ReadCount = UART_UFSIZE、UART
    //写入 UART
    UART_WRITE (UART、缓冲区、BUFSIZE);
    //关闭 UART
    UART_CLOSE (UART); 

    在上面的代码中,我可以使用 ReadCount 作为特定字符的条件检查,比如说'\n',然后使用 systemprintf()中的缓冲区,如下所示。

    if (ReadCount ='\n')

    System_printf (buffer);

    因此,我的目标是接收以\n 结尾的行逗号分隔字符,将其存储在缓冲区中,然后使用 system_printf (buffer)打印缓冲区。

    我是对的吗?

    提前感谢。

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

    Shivam、

    否,返回 UART_read()是写入的字节数,如果是这样做的话  

    if (ReadCount ='\n') 

    您正在将驱动程序读取的字节数与字符'\n'进行比较。

    Daniel

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

    然后、我如何接收每个传入的字符行、直到"\n"、然后将它们存储在缓冲区中、然后清除该缓冲区。

    谢谢、

    Shivam

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

    Shivam、

    一种方法是在循环中使用 UART_READ()函数逐个检查您在缓冲区中读取的每个字符。

    此致、

    Daniel

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

    可以、但 UART_Read 返回读取的字节数、我必须检查传入字符、但现在我可以通过访问 uartecho 代码中的 char 输入变量来执行该操作、 但是、由于这是一个字符变量、我必须将其转换为数组或字符串、并将其全部存储到 SD 卡中。

    如何操作?

    谢谢、

    Shivam

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

    不能将 UART_READ()* return*值与'/n'进行比较。 必须将*缓冲区*(如果缓冲区是数组,则为 buffer[n])与'/n'进行比较。

    重要的是 UART_READ()函数将数据放入缓冲区,因此需要检查缓冲区而不是返回值。

    Daniel

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

    好的、Daniel、谢谢。 您能告诉我可以传递到 UART 中缓冲区的最大大小吗?是否可以将接收到的 UART 字符转换为字符串或任何与 readstring相似 的内置函数、直到在 Arduino 中。 如下所示。

    https://www.arduino.cc/reference/en/language/functions/communication/serial/readstringuntil/

    readStringUntil() 将字符从串缓冲区读取到字符串中。 如果超时,函数将终止(请参见 setTimeout())。

    提前感谢。

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

    缓冲器的大小取决于您的应用。

    与您在上面发布的 Adruino 命令没有直接等效的命令、但您可能可以查看命令的源代码、并对其进行逆向工程以使其在 CC2652器件上工作。

    我建议您阅读驱动程序文档、其中包含 UART 驱动程序的示例和说明。  https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_4_30_00_54/docs/drivers/doxygen/html/_u_a_r_t_c_c26_x2_8h.html 

    具体而言、请查看显示示例应用代码的"用例"部分。 "带返回部分的接收"示例使用 UARTCC26X2_CMD_RETURE_PARTI_ENABLE、 我认为这与您在上面描述的内容类似。 它允许 UART_READ()在读取请求的字节数或读取超时时返回。

    此致、

    Daniel

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

    好的、那么我如何在 UART_READ 命令函数中更改缓冲区大小。

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

    Shivam、

    这显示在上面链接的文档中。

    UART_Handle handle;
    UART_Params 参数;
    uint8_t rxBuf[100]; //接收缓冲
    器 uint32_t timeoutU= 5000;// 5ms 超时、默认超时不是超时(BIOS_WAIT_FOREVER)
    // Init UART 并指定非默认参数
    UART_PARAMS_INIT (&params);
    params.baudate = 9600;
    params.writeDataMode = UART_DATA_binary;
    params.readTimeout = timeoutU/ ClockP_getSystemTickPeriod ();//默认节拍周期为10us
    //打开 UART 并执行读取
    句柄= UART_open (CONFIG_UART、&params);
    int Bytes = UART_read (handle、rxBuf); 

    这使得缓冲区成为一个100字节数组(uint8_t rxBuf[100];)并且 uart_read ()将100字节读入 rxBuf (int rxBytes = UART_Read (handle、rxBuf、100);)

    Daniel

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

    好的、因此我接收到 UART 数据、并且必须将相同的数据写入 SD 卡中、因此我在 UART_READ 和 UART_WRITE 函数之后使用了 fatsd 代码、但无法将数据写入 SD 卡。
    我无法写入任何数据、代码将获得 stuck.e2e.ti.com/.../uartechofatsd-merged-uart-code-coming.txt

    谢谢、

    Shivam

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

    您将 UART 数据读取为一个字节、而不是一个字节数组。

    特性 输入;<-是单个字符(1个字节)
    

    while (输入!='\n')
    {
    UART_READ (UART、INPUT、1);
    UART_WRITE (UART、INPUT、1);
    } 

    该循环反复写入该单字节。 它不会创建一个字节数组。 它将1个字节读入变量`INPUT`、然后将同一个字节写入 UART。

    我看不到您尝试将 UART 缓冲器写入 SD 卡的任何位置。

    此外、您将打开 GPIO 和 UART 驱动程序两次、并初始化 GPIO 两次。

    您的代码在哪里卡住? 有许多 println 调试语句。 您是否在终端上读取这些数据? 您是否正在使用断点或观察变量? 您可能应该逐步浏览您的代码、以便您了解系统中发生的情况。

    Daniel

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

    您将 UART 数据读取为一个字节、而不是一个字节数组。

    该循环反复写入该单字节。 它不会创建一个字节数组。 它将1个字节读入变量`INPUT`、然后将同一个字节写入 UART。 : 是的,我知道,事实上,如果我能够逐字节写入数据,这是可以的。

    我看不到您尝试将 UART 缓冲器写入 SD 卡的任何位置。 :是的,当我尝试在 while 循环中插入 fatsd 代码时,我只是尝试将样本数据写入 SD 卡,同时在终端上接收 UART 数据。

    此外、您将打开 GPIO 和 UART 驱动程序两次、并初始化 GPIO 两次。 :我会解决这个问题

    您的代码在哪里卡住? 有许多 println 调试语句。 您是否在终端上读取这些数据? 您是否正在使用断点或观察变量? 您可能应该逐步浏览您的代码、以便您了解系统中发生的情况。 : 正如我在 while 循环之后提到的,它不起作用,我无法在终端中查看 println 语句。

    您能告诉我一个 UART_Read 和 UART_WRITE 之后的简单代码、我可以在其中将接收到的 UART 字符写入 SD 卡吗? 您只告诉我将管理的离开其他声明等的代码。 这将是一个很大的帮助。

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

    谢谢 Daniel、我进一步缩小了代码范围。 请参阅附件中的整个代码以及语法荧光笔中的重要部分。 它仍然会卡住。 在 while (1)循环中、我只能看到 UART 数据一次、然后它会卡住、但我希望数据持续出现、并在 SD 卡输入文件中写入虚拟文本数组[]数据(在附加文件中声明和定义)。 这是我想要的。 非常感谢您的耐心等待。

    while (1)
    {
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF);
    int rxBytes = uart_read (handle、rxBuf、200);
    UART_WRITE (handle、rxBuf、200);
    src = fopen (inputfile、"w+");
    fwrite (textarray、1、strlen (textarray)、src);
    fflush (src);
    回卷(src);
    fclose (src);
    SDFatFS_Close (sdfatfsHandle);
    } 

    我还在附加调试快照、其中程序卡在行中  

    int rxBytes = uart_read (handle、rxBuf、200);但如果注释了 SD 相关代码、则不会卡在此处。 

    e2e.ti.com/.../uartsd.txt

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

    在循环中关闭 SDFatFS 驱动程序、绝不重新打开它。

    您可能还会在循环中过多地漏掉 UART 数据。 我认为读取所有 UART 数据更容易、然后将整个字符串写入 SDCard。

    在组合之前、您可能应该使每一个片段都正常工作(FatFS SD 写入、UART 读取)、以便您可以隔离问题。

    Daniel

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

    在循环中关闭 SDFatFS 驱动程序、绝不重新打开它。 :我已尝试在循环中打开驱动程序,但它仍然无法正常工作。

    您可能还会在循环中过多地漏掉 UART 数据。 我认为读取所有 UART 数据更容易、然后将整个字符串写入 SDCard。 :我正在发送大量数据,无法逐字节读取和写入,我也尝试过这种方法,但没有发生这种情况。 我还尝试阅读其中的一部分、但也没有得出结果。  

    在组合之前、您可能应该使每一个片段都正常工作(FatFS SD 写入、UART 读取)、以便您可以隔离问题。 :我尝试了每一个单独工作的部件,两个部件都是单独工作的,但我将它们合并成一个代码时不工作。  

    其中一个原因可能是我使用 xds110 UART 连接进行显示、而 XDS 110也连接到硬件 UART、我在那里接收数据。 但是、我已通过 XDS110 UART 断开硬件 UART RX 跳线、然后接收来自另一个微控制器的数据。  是否最好通过另一个默认未连接到 xds110的 UART 接收数据。

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

    Daniel、您好!

    我还尝试在驱动程序中打开和关闭 SDFatFS 驱动程序、但它仍然卡住。 请参阅以下代码。

    句柄= UART_OPEN (CONFIG_UART_0、params);
    if (handle == NULL){
    /* UART_open()失败*/
    while (1);
    }
    /*打开用户 LED 指示初始化成功*/
    
    while (1)
    {
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    UART_READ (handle、&rxBuf、1);
    //UART_WRITE (handle、&rxBuf、1);
    /*安装并注册 SD 卡*/
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    src = fopen (inputfile、"w+");
    fwrite (textarray、1、strlen (textarray)、src);
    fflush (src);
    回卷(src);
    fclose (src);
    SDFatFS_Close (sdfatfsHandle);
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    }
    

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

    Daniel、您好、请参阅下面的代码、我发现程序卡在 fwrite 语句中。 如何解决? 如果您注意到我使用 GPIO_LED0进行调试、即使我在 while 循环中 fwrite 后将其关闭、LED 也会保持开启状态。

    请帮我、这将是一个很好的帮助。

    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    while (1)
    {
    
    UART_READ (handle、&rxBuf、1);
    
    //UART_WRITE (handle、&rxBuf、1);
    /*安装并注册 SD 卡*/
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    
    src = fopen (inputfile、"w+");
    
    fwrite (textarray、1、strlen (textarray)、src);
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF);//此语句中没有代码。
    fflush (src);
    回卷(src);
    fclose (src);
    SDFatFS_Close (sdfatfsHandle);
    
    
    } 

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

    是否确保已成功打开文件?

    /*打开文件进行读取和写入*/
    src = fopen (inputfile、"w+");
    如果(!src){
    Display_printf (display、0、0、
    无法创建“错误:\%s\”。\n 请检查“
    "如果需要其他跳线、请访问 Board.html。\n"、
    InputFile);
    Display_printf (display、0、0、"Aborting...\n"\});
    while (1);
    } 

    同样、您可能需要在循环外执行句柄初始化和打开、因为将会有大量开销打开和关闭句柄、只读取1个 UART 字符。

    Daniel

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

    是的、我已经尝试在循环之前打开句柄。 但是、我想通知您代码卡在 UART_READ()语句中、而不是 fwrite()中。 很抱歉给您带来不便。 我使用了调试器来查看它。

    我应该怎么做才能避免它卡在 UART_READ()中?

    谢谢、此致、

    Shivam

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

    UART_READ()返回的状态是什么? 手柄是否打开正常?

    什么是硬件设置? 您是否连接了逻辑分析仪以确保数据符合您的预期?  

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

    UART_READ()返回的状态是什么? 手柄是否打开正常?

    UART_OPEN 返回成功状态。 但问题出在 UART_READ()中。
    请参阅以下代码:

    void * mainThread (void * arg0)
    {
    UART_Handle 句柄;
    UART_Params 参数;
    char rxBuf; //接收缓冲区
    SDFatFS_Handle sdfatfsHandle;
    文件*src;
    /*调用驱动程序初始化函数*/
    GPIO_init();
    UART_INIT();
    SDFatFS_init();
    /*配置 LED 引脚*/
    GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    add_device (fatfsPrefix、_MSA、ffcio_open、ffcio_close、ffcio_read、
    ffcio_write、ffcio_lseek、ffcio_unlink、ffcio_rename);
    //初始化 UART 并指定非默认参数
    UART_PARAMS_INIT (params);
    params.baudrate = 115200;
    //创建一个数据处理关闭的 UART。
    params.writeDataMode = UART_DATA_TEXT;
    params.readDataMode = UART_DATA_TEXT;
    Params.readReturnMode = UART_return_NEWLINE;
    //params.readEcho = UART_ECHO_OFF;
    params.baudrate = 115200;
    /*打开用户 LED 指示初始化成功*/
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    
    //打开 UART 并执行读取操作
    句柄= UART_OPEN (CONFIG_UART_0、params);
    if (handle == NULL){
    /* UART_open()失败*/
    
    while (1);
    
    }
    
    UART_READ (handle、&rxBuf、1);
    
    //UART_WRITE (handle、&rxBuf、1);
    
    //UART_WRITE (handle、&rxBuf、1);
    /*安装并注册 SD 卡*/
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    src = fopen (inputfile、"r");
    如果(!src){
    /*打开文件进行读取和写入*/
    src = fopen (inputfile、"w+");
    如果(!src){
    while (1);
    }
    fwrite (textarray、1、strlen (textarray)、src);
    
    
    }
    fclose (src);
    SDFatFS_Close (sdfatfsHandle);
    }
    

     

    什么是硬件设置? 您是否连接了逻辑分析仪以确保数据符合您的预期?  

    我将 Arduino TX 连接到 TICC2652LP RX、并使用 XDS110部分移除 RX 跳线。 否、我没有连接逻辑分析仪来查看它。

     

    我认为 UART_READ()的用法有问题。 它应在回调模式下使用、然后将其与 SD 代码合并。
    请帮助我、因为它对我来说需要太长时间。

    谢谢、

    Shivam

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

    Shivam、

    您能否详细说明 UART_READ()的问题是什么? 不会将任何内容返回到读取缓冲器? 在函数中卡住了吗? 您是否使用了调试器来单步执行该函数? 您是否已验证 UART_READ()在没有 SD 卡代码的情况下工作?

    此致、

    Daniel

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

    感谢 Daniel 的耐心。
    我使用过调试器,是的,UART_READ()在没有 SD 卡代码的情况下工作正常。
    我已经取得了一些小进展、现在我能够在 SD 卡中写入虚拟代码、同时从 UART 接收一个字符。 我是说我只能接收一次字符、同时进行文件写入。 我正在附加代码、但我希望持续接收 UART 数据并在其中写入虚拟文本。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /* POSIX 头文件*/
    #include 
    #include 
    #include 
    
    //#include 
    #include 
    #include 
    #include 
    /* XDC 模块接头*/
    #include 
    #include 
    /*驱动程序配置*/
    #include "ti_drivers_config.h"
    static SEM_t sem;
    static volatile size_t numBytesRead;
    //文件复制过程中使用的缓冲区大小*/
    #ifndef cpy_buy_size
    #define cpy_buff 2048
    #endif
    
    /*字符串转换宏*/
    #define STR_(n) #n
    #define STR (n) STR_(n)
    
    /*用于 FatFs 的驱动器编号*/
    #define DRIVE_NUM 0
    
    const char inputfile[]="fat:"STR (drive_NUM)":input.txt;
    const char outputfile[]="fat:"espec (drive_NUM)":output.txt;
    
    const char array []="Hello from shivam";
    
    //static Display_Handle display;
    
    //将此设置为当前
    的 construct 时间*、单位为 t
    .tv_sec = 1469647026、
    tv_nsec = 0
    };
    
    //此文件系统的文件名前缀,用于 TI C RTS */
    char fatfsPrefix[]="fat";
    
    unsigned char cpy_buff [cpy_buff _size];
    //
    *==== callbackFxn ====
    //
    void callbackFxn (UART2_Handle handle、void * buffer、size_t count、
    void * userArg, int_fast16_t status)
    {
    if (status!= UART2_STATUS_SUCCESS){
    /* UART2_READ()中出现 RX 错误*/
    while (1);
    }
    
    numBytesRead = count;
    SEM_POST (&SEM);
    }
    
    
    /*
    ==== mainThread ====
    * Thread 执行文件复制
    *
    * Thread 尝试打开现有文件 inputfile[]。 如果文件
    不存在*、请创建一个文件并在其中写入一些已知内容。
    *然后将 inputfile[]的内容复制到输出文件
    * outputfile[]。 完成后
    、输出文件的内容*打印到系统控制台上(stdout)。
    //
    void * mainThread (void * arg0)
    {
    特性 输入;
    const 字符 回声波峰[]="回声字符:\r\n";
    UART2_Handle 句柄;
    UART2_Params uartParams;
    内部32_t semStatus;
    uint32_t STATUS = UART2_STATUS_SUCCESS;
    SDFatFS_Handle sdfatfsHandle;
    /*创建信标*/
    semStatus = SEM_INIT (&SEM、0、0);
    
    if (semStatus!= 0){
    /*创建信标时出错*/
    while (1);
    }
    
    /*在回调读取模式下创建 UART */
    UART2_Params_init (uartParams);
    uartParams.readMode = UART2_Mode_callback;
    uartParams.readCallback = callbackFxn;
    uartParams.baudrate = 115200;
    
    句柄= UART2_open (CONFIG_UART2_0、uartParams);
    
    if (handle == NULL){
    /* UART2_open()失败*/
    while (1);
    }
    
    /*打开用户 LED 指示初始化成功*/
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    
    /*对 bytesWritten 传递 NULL,因为它未在本示例中使用*/
    UART2_WRITE (handle、echoPrompt、sizeof (echoPrompt)、NULL);
    
    /*循环永久回显*/
    while (1){
    numBytesRead = 0;
    
    /*对 bytesRead 传递 NULL,因为它未在本示例中使用*/
    STATUS = UART2_READ (handle、&input、1、NULL);
    
    if (status!= UART2_STATUS_SUCCESS){
    /* UART2_READ()失败*/
    while (1);
    
    }
    
    /*在执行读回调之前不要写入*/
    SEM_WAIT (SEM);
    
    if (numBytesRead > 0){
    STATUS = UART2_WRITE (handle、&input、1、NULL);
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    CIO 函数的/*变量*/
    文件*src;
    /*调用驱动程序初始化函数*/
    GPIO_init();
    
    SDFatFS_init();
    
    /*配置 LED 引脚*/
    GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
    /* add_device()应调用一次,并用于所有介质类型*/
    add_device (fatfsPrefix、_MSA、ffcio_open、ffcio_close、ffcio_read、
    ffcio_write、ffcio_lseek、ffcio_unlink、ffcio_rename);
    
    /*打开输出的显示屏*/
    //display = Display_open (Display_Type_UART、NULL);
    //if (display =NULL){
    /*无法打开显示驱动程序*/
    // while (1);
    //}
    
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    
    /*打开用户 LED */
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    
    //Display_printf (display、0、0、"启动 fatsd 示例\n");
    //Display_printf (display、0、0、
    //“此示例需要 SD 卡上的 FAT 文件系统。\n”);
    //Display_printf (display、0、0、
    //"如果您的 SD 卡未使用文件系统格式化、您将收到错误。\n");
    
    /*安装并注册 SD 卡*/
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    //if (sdfatfsHandle == NULL){
    //Display_printf (display、0、0、"启动 SD 卡时出错\n");
    // while (1);
    //}
    //else{
    // Display_printf (display、0、0、"已安装驱动器%u "、drive_NUM);
    //}
    
    /*尝试打开源文件*/
    src = fopen (inputfile、"r");
    如果(!src){
    //Display_printf (display、0、0、"创建新文件\"%s\..."、
    //inputfile);
    
    /*打开文件进行读取和写入*/
    src = fopen (inputfile、"w+");
    如果(!src){
    //Display_printf (display、0、0、
    //无法创建“错误:\""%s\"。\n 请检查“
    //"Board.html 如果需要其他跳线。\n"、
    // inputfile);
    //Display_printf (display、0、0、"Aboring……\n");
    while (1);
    }
    
    fwrite (textarray、1、strlen (textarray)、src);
    fflush (src);
    
    /*重置内部文件指针*/
    回卷(src);
    
    //Display_printf (display、0、0、"Done");
    }
    否则{
    //Display_printf (display、0、0、"使用\"%s\"\n"的现有副本、
    //inputfile);
    }
    /*关闭 inputfile[]*/
    fclose (src);
    /*停止 SDCard */
    SDFatFS_Close (sdfatfsHandle);
    //Display_printf (display、0、0、"Drive %u unmounted \n"、drive_NUM);
    
    
    if (status!= UART2_STATUS_SUCCESS){
    /* UART2_write()失败*/
    while (1);
    }
    }
    返回(NULL);
    }
    
    }
    
    /*
    === fatfs_getFatTime ===
    */
    int32_t fatfs_getFatTime (void)
    {
    time_t 秒;
    uint32_t fatTime;
    struct tm *pTime;
    
    /*
    * TI TIME()返回1900年以来经过的秒数,而其他工具则返回
    *从1970年起返回秒数。 但是、TI 和 GNU localtime()
    *将 TM TM_year 设置为1900年以来的年数。
    *
    秒=时间(空);
    
    pTime = localtime (&seconds);
    
    /*
    * localtime()将 pTime->TM_year 设置为年数
    *自1900年起、因此从 TM_year 中减去80即可获得 FAT 时间
    *自1980年起的偏移量。
    *
    fatTime =((uint32_t)(pTime->TM_year - 80)<< 25)|
    ((uint32_t)(pTime->TM_mon)<< 21)|
    ((uint32_t)(pTime->tm_mday)<< 16)|
    ((uint32_t)(pTime->tm_hour)<< 11)|
    ((uint32_t)(pTime->TM_min)<< 5)|
    ((uint32_t)(pTime->TM_sec)>> 1);
    
    返回((int32_t) fatTime);
    }
    

    此致、

    Shivam

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

    已尝试在  中帮助您。 对于同一个问题、创建无数个帖子不会有所帮助。

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

    请不要在任何地方发布相同的回复。 丹尼尔一直很好地帮助我、而你停止回复我、这就是我创建另一篇帖子的原因。 如果您无法支持、请不要为他人造成问题。

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

    基本上、步骤是:

    1.使用 fatsd 示例作为基础。

    2.将 UART 线程添加到 fatsd 示例中。

    3.使用信标控制在 UART 线程中接收到的将消息传递到 fatsd 线程中以写入 fatsd。

    希望这对您有所帮助。

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

    是的,我正在执行上述步骤1、2和3。 通过这些步骤、我一次只能接收一个字符、然后在按下复位后再次接收。 我还能够将虚拟数据写入文件一次。 但是、我希望以高数据速率同时接收 UART 数据。  
    如果我不在 UART 线程中执行 fopen/fwrite/fclose 操作、那么我将如何能够将 UART 数据写入 SD 卡。
    请参阅上面所附的代码、否则建议仅用于 UART 控制接收和写入的短代码。

    谢谢、

    Shivam

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

    Shivam、

    YiKai 的建议是一种很好的方法(多线程和使用信标)。 正如 YiKai 提到的、在多个线程中发布会使支持变得困难、因为很难跟踪。 请将主题集中在一个问题上、以便我们可以帮助回答。  

    另一种方法是在连续回调模式下使用 UART、如下所示: https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_4_30_00_54/docs/drivers/doxygen/html/_u_a_r_t_c_c26_x_x_8h.html#USE_CASE_CB 

    然后、您可以使用回调函数创建要写入 SD 卡的数组/字符串。

    此致、

    Daniel

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

    非常感谢 Daniel。 我也会尝试这种方法。
    我已经尝试过 yikai 的建议、但按下 launchpad 上的 RESET 按钮后、我只能读取和写入一个字节。 我想我无法使用信标、或者代码卡在某个位置。 我还尝试逐行调试它、但无法执行、因为我获取文件未找到错误。 请参考我的当前代码、看看您是否可以为其提供帮助。 我知道我不应该创建多个线程并保持线程的焦点、但由于我没有获得支持、这就是我创建这些线程的原因。 我对这种环境有点陌生、想要学习它并在我的大学项目中应用、以便从 Arduino 迁移。 对于由此给您带来的不便、我仍然深表歉意。

    谢谢、

    Shivam

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /* POSIX 头文件*/
    #include 
    #include 
    #include 
    
    //#include 
    #include 
    #include 
    #include 
    /* XDC 模块接头*/
    #include 
    #include 
    /*驱动程序配置*/
    #include "ti_drivers_config.h"
    static SEM_t sem;
    static volatile size_t numBytesRead;
    //文件复制过程中使用的缓冲区大小*/
    #ifndef cpy_buy_size
    #define cpy_buff 2048
    #endif
    
    /*字符串转换宏*/
    #define STR_(n) #n
    #define STR (n) STR_(n)
    
    /*用于 FatFs 的驱动器编号*/
    #define DRIVE_NUM 0
    
    const char inputfile[]="fat:"STR (drive_NUM)":input.txt;
    const char outputfile[]="fat:"espec (drive_NUM)":output.txt;
    
    //const char array []="Hello from shivam";
    
    //static Display_Handle display;
    
    //将此时间设置为当前的 UNIX 文本时间*
    
    .tv_sec = 1469647026、
    tv_nsec = 0
    };
    
    //此文件系统的文件名前缀,用于 TI C RTS */
    char fatfsPrefix[]="fat";
    
    unsigned char cpy_buff [cpy_buff _size];
    //
    *==== callbackFxn ====
    //
    void callbackFxn (UART2_Handle handle、void * buffer、size_t count、
    void * userArg, int_fast16_t status)
    {
    if (status!= UART2_STATUS_SUCCESS){
    /* UART2_READ()中出现 RX 错误*/
    //while (1);
    }
    
    numBytesRead = count;
    SEM_POST (&SEM);
    }
    
    
    /*
    ==== mainThread ====
    * Thread 执行文件复制
    *
    * Thread 尝试打开现有文件 inputfile[]。 如果文件
    不存在*、请创建一个文件并在其中写入一些已知内容。
    *然后将 inputfile[]的内容复制到输出文件
    * outputfile[]。 完成后
    、输出文件的内容*打印到系统控制台上(stdout)。
    //
    void * mainThread (void * arg0)
    {
    特性 输入;
    //const char 回声波峰[]="回声字符:\r\n";
    UART2_Handle 句柄;
    UART2_Params uartParams;
    内部32_t semStatus;
    uint32_t STATUS = UART2_STATUS_SUCCESS;
    SDFatFS_Handle sdfatfsHandle;
    /*创建信标*/
    semStatus = SEM_INIT (&SEM、0、0);
    
    if (semStatus!= 0){
    /*创建信标时出错*/
    //while (1);
    }
    
    /*在回调读取模式下创建 UART */
    UART2_Params_init (uartParams);
    uartParams.readMode = UART2_Mode_callback;
    uartParams.readCallback = callbackFxn;
    uartParams.baudrate = 115200;
    
    句柄= UART2_open (CONFIG_UART2_0、uartParams);
    
    if (handle == NULL){
    /* UART2_open()失败*/
    //while (1);
    }
    
    /*打开用户 LED 指示初始化成功*/
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    
    /*对 bytesWritten 传递 NULL,因为它未在本示例中使用*/
    //UART2_WRITE (handle、echoPrompt、sizeof (echoPrompt)、NULL);
    
    /*循环永久回显*/
    while (1){
    numBytesRead = 0;
    
    /*对 bytesRead 传递 NULL,因为它未在本示例中使用*/
    STATUS = UART2_READ (handle、&input、1、NULL);
    
    if (status!= UART2_STATUS_SUCCESS){
    /* UART2_READ()失败*/
    //while (1);
    
    }
    
    /*在执行读回调之前不要写入*/
    SEM_WAIT (SEM);
    
    if (numBytesRead > 0){
    STATUS = UART2_WRITE (handle、&input、1、NULL);
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    CIO 函数的/*变量*/
    文件*src;
    /*调用驱动程序初始化函数*/
    GPIO_init();
    
    SDFatFS_init();
    
    /*配置 LED 引脚*/
    GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
    /* add_device()应调用一次,并用于所有介质类型*/
    add_device (fatfsPrefix、_MSA、ffcio_open、ffcio_close、ffcio_read、
    ffcio_write、ffcio_lseek、ffcio_unlink、ffcio_rename);
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    /*打开用户 LED */
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    /*安装并注册 SD 卡*/
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    /*打开文件进行读取和写入*/
    src = fopen (inputfile、"w+");
    fwrite(&INUT, 1, src);
    /*关闭 inputfile[]*/
    fclose (src);
    /*停止 SDCard */
    SDFatFS_Close (sdfatfsHandle);
    }
    返回(NULL);
    }
    }//*
    
    
    ==== fatfs_getFatTime ===
    */
    int32_t fatfs_getFatTime (void)
    {
    time_t 秒;
    uint32_t fatTime;
    struct tm *pTime;
    
    /*
    * TI TIME()返回1900年以来经过的秒数,而其他工具则返回
    *从1970年起返回秒数。 但是、TI 和 GNU localtime()
    *将 TM TM_year 设置为1900年以来的年数。
    *
    秒=时间(空);
    
    pTime = localtime (&seconds);
    
    /*
    * localtime()将 pTime->TM_year 设置为年数
    *自1900年起、因此从 TM_year 中减去80即可获得 FAT 时间
    *自1980年起的偏移量。
    *
    fatTime =((uint32_t)(pTime->TM_year - 80)<< 25)|
    ((uint32_t)(pTime->TM_mon)<< 21)|
    ((uint32_t)(pTime->tm_mday)<< 16)|
    ((uint32_t)(pTime->tm_hour)<< 11)|
    ((uint32_t)(pTime->TM_min)<< 5)|
    ((uint32_t)(pTime->TM_sec)>> 1);
    
    返回((int32_t) fatTime);
    }