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:用于接收字符的函数、直至'\n#39;。

Guru**** 2560460 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/950797/ccs-lp-cc2652rb-function-to-receive-characters-till-n

器件型号:LP-CC2652RB
Thread 中讨论的其他器件:SysConfig

工具/软件:Code Composer Studio

大家好、我正在将字符从 UART 读取到 cc2652中。 我使用  UART_READ (UART、INPUT、1) 一次接收一个字节的字符。 是否有任何函数可以接收字符串、直到出现诸如'\n'之类的特定字符。 请建议是否有与 readstringuntil ("\n")等效的内容。

谢谢、

Shivam  

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

    您好!

    为此、您需要使用 CC26X2版本的 UART 驱动程序并选择选项"在新线路上返回"。 必须通过 SysConfig 选择 CC26X2版本的驱动程序。 驱动器的返回行为通过用于调用 UART_OPEN 的参数进行选择。

    此致、

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

    您好!

    您需要在代码中实现它。  

    -kel

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

    您可以使用以下伪代码执行此操作。

    uint8_t idx=0;
    char buf[256];
    
    uart_read (UART、&input、1、 空);
    如果(输入!='\n'){
    //将输入收集到 buf[]
    buf[idx]=输入;
    IDX++;
    }否则{
    //输入字符为“\n”,您可以执行在 buf[]
    中收集的任何操作
    
    
    

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

    好的、谢谢、我正在使用来自 cc26x2 SDK 的 uartecho 代码、因此我仍然需要使用其他工具来实现 cc2652版本的 UART 驱动程序。
    谢谢、

    Shivam

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

    你好,YK 感谢你的答复。
    我尝试将 buf 字符串写入 SD 卡、但在使用代码时 SD 卡中没有写入任何内容。
    请参阅以下代码。 我使用单独的线程将文本写入 SD 卡文件。 我怀疑的一点是、当我在 UART 线程的 buf 数组中收集 UART 数据时、文件对象是否可以访问其代码中的 buf 数组。 尽管我将 buff 数组全局声明为 extern char buf [256]。

    这是我传递消息在线程之间切换的代码:

    while (1){
    
    uint8_t idx=0;
    
    
    UART_READ (UART、INPUT、1);
    if (输入='\n')
    {
    MSG = 5;
    mq_send (* mqdes、(char *)&msg、sizeof (msg)、0);
    //collect input into buf[]
    
    }
    其他
    {
    //输入字符为“\n”,您可以执行在 buf 中收集的任何操作[]
    buf[idx]=输入;
    IDX++;
    }
    
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF);
    UART_WRITE (UART、INPUT、1);
    } 

    这是我尝试通过接收消息将文本写入文件的代码。

    while (mq_receive (* mqdes、(char *)&msg、sizeof (msg)、NULL)!=-1)
    {
    /*打开用户 LED */
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    Task_sleep (sleepTickCount);
    SDFatFS_Handle sdfatfsHandle;
    文件*src;
    SDFatFS_init();
    add_device (fatfsPrefix、_MSA、ffcio_open、ffcio_close、ffcio_read、
    ffcio_write、ffcio_lseek、ffcio_unlink、ffcio_rename);
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    /*打开文件进行读取和写入*/
    src = fopen (inputfile、"w+");
    fseek (src、0、seek_end);
    //fwrite (&I、1、1、src);
    fwrite (buf、256、strlen (buf)、src);
    /*关闭 inputfile[]*/
    fclose (src);
    /*停止 SDCard */
    SDFatFS_Close (sdfatfsHandle);
    }
    

    注意:这两个代码都是我在项目中用单独的 c 文件编写的。 我已将 buf 数组声明为 extern char buf[256]、以便在单独的 c 文件中使用它将其写入 SD 卡文件中。

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

    我只能建议您使用 CCS 来跟踪和调试您自己的应用代码。

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

    好的、感谢 YK、但它只是一个调试案例。 我已经按照您在前面的帖子中的建议实施了"红点"功能。 我离我的最终目标只有一步之遥、即将输入的字符写入 SD 卡。
    休息、一切都完成了。 它仅具有 CCS 功能。 请看一下我在上面的答复。

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

    1.你把这两个 while 循环放在哪里? 在不同的线程/任务中还是在同一个线程/任务中?

    2.为什么要在 while 循环中继续调用 SDFatFS_init、SDFatFS_open 和 SDFatFS_close? 您只能调用它们一次。

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

    1.你把这两个 while 循环放在哪里? 在不同的线程/任务中还是在同一个线程/任务中?

    这两个 while 循环处于不同的任务中、如下面附加的图像所示。 第一个 while 循环"while (1)"位于 fatsd.c 中、另一个 while 循环位于 alarm.c 中
    在 fatsd 中、我从另一个微控制器接收 UART 数据、并将消息传递到 alarm.c 文件中的另一个任务、以在 SD 卡中写入 buf 阵列数据。

    2.为什么要在 while 循环中继续调用 SDFatFS_init、SDFatFS_open 和 SDFatFS_close? 您只能调用它们一次。

    好的、但如果文件在写入一次后保持打开、这不会导致写入数据时出现问题? 我只是尝试打开、写入和关闭文件。 因为我没有对何时关闭文件实施任何时间限制。 它应该继续写入、直至电路板通电。

    谢谢、

    Shivam

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

    您好!

    正如我在第一条消息中提到的、CC26X2 UART 驱动程序能够在新线路上返回。

    1-使用 SysConfig 激活正确的驱动程序:

    2-按如下方式设置 UART 驱动程序:

    UART_Handle UART;
    UART_Params uartParams;
    
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_TEXT;
    uartParams.readDataMode = UART_DATA_TEXT;
    uartParams.readReturnMode = UART_return_NEWLINE;
    
    UART = UART_OPEN (CONFIG_UART_0、uartParams); 

    此致、

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

    无论如何、如果您的应用程序获得了正确的 sdfatfsHandle 和 src、您可能需要在开始向文件写入数据之前进行跟踪和调试。

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

    大家好、请看我的 SysConfig 屏幕截图、我认为它已经处于 CC26x2驱动程序模式。 我也没有获得使用 cc26x2驱动程序而不是 cc26xx 的选项、就像您的情况一样。

      

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

    我不认为是这样的情况、因为我在收到"\n"字符时能够将一些虚拟数据写入文件中。

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

    如果您在收到"\n"字符时能够将一些虚拟数据写入文件、则消息队列处理中必须存在错误。 这不在本论坛的范围之内、您是自己的。

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

    好的、好的。 我会尝试、但您能告诉我的方法是正确还是需要更改。 以便我可以在同一行中前进吗?

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

    简要看一下您的代码,我看不到为什么您在 UART 读取的 while (1)循环中输入“uint8_t idx=0;”。

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

    我已从您之前建议的伪代码中获取此器件、如下所示。 接收到"\n"后、我尝试将一行字符串写入 buff 数组。 如果我在 while 循环中不使用 uint8_t idx = 0、则当 idx 超过256时、buf 数组将溢出。

    uint8_t idx=0;
    char buf[256];
    
    uart_read (UART、&input、1、 空);
    如果(输入!='\n'){
    //将输入收集到 buf[]
    buf[idx]=输入;
    IDX++;
    }否则{
    //输入字符为“\n”,您可以执行在 buf[]
    中收集的任何操作
    

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

    然后、您应该限制在将其发送到 SD 卡写入之前不允许超过256个字节。 我在测试中做了同样的事情,我确信没有问题。

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

    我怎么能做到这一点?

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

    添加一个 if 条件以检查已收集的字节数。 当它达到256字节时、暂停收集并首先向 SD 卡写入缓冲区。 SD 写入后、清除缓冲区并再次从头开始收集。

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

    谢谢,我会尝试这个。  
    现在、我想我基本上已经解决了这个问题。 现在还有一件事、即 SD 卡文件将被接收到的最后256个字节写入。 我认为问题是使用 fseek 在最后一个写入位置移动文件指针。 我使用 fseek 命令、如下所示:

    fseek (src、0、seek_end); 

    对吗?

    我还尝试了 fputs (buf、src)、但数据只是写入 SD 卡文件一次。  

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

    fseek 用法对我来说没有问题。

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

    好的、现在正如您先前所建议的、我没有在 while 循环中使用 sdfatfs_open 和 sdfatfs_close、而是将其写入 while 循环之外。 现在、仅从 UART 接收到的最后一组256字节将写入 SD 卡。 这意味着代码的功能正常、因为我正在持续接收 UART 数据、并且在接收到"\n"时、板载 LED 闪烁。  据我了解、文件内容每次都在同一位置被覆盖。  更清楚的是、每次我收到"\n"字符时、我都会在文件写入代码行后在板上指示灯上闪烁、这意味着它正在成功地将内容写入 SD 卡中的文件中。 但可见内容是在断开电路板连接之前接收到的最后一组字节。 我必须在文件中附加内容、还是因为我每次在 while 循环中打开文件、这就是问题发生的原因? 当我在 while 循环之外放置 fopen 时、不会写入任何内容。 因此 fopen 不是问题。 请在收到消息队列后参阅我的 while 循环代码线程。

    SDFatFS_Handle sdfatfsHandle;
    文件*src;
    SDFatFS_init();
    add_device (fatfsPrefix、_MSA、ffcio_open、ffcio_close、ffcio_read、
    ffcio_write、ffcio_lseek、ffcio_unlink、ffcio_rename);
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    
    while (mq_receive (* mqdes、(char *)&msg、sizeof (msg)、NULL)!=-1){
    /*打开用户 LED */
    /*打开文件进行读取和写入*/
    src = fopen (inputfile、"w+");
    fseek (src、0、seek_end);
    //fwrite (&I、1、1、src);
    fwrite (textarray、1、strlen (textarray)、src);
    fwrite (buf、1、strlen (buf)、src);
    /*关闭 inputfile[]*/
    //fclose (src);
    /*停止 SDCard */
    fclose (src);
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    Task_sleep (sleepTickCount);
    }
    
    SDFatFS_Close (sdfatfsHandle); 

    我非常接近 YK,这是因为你非常感谢你,我对我以前的粗鲁行为表示歉意。

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

    我建议您在 while 循环的外部执行 fopen/fclose 操作、以避免每次要写入缓冲区时出现 fseek。

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

    我已经尝试过该 YK,在这种情况下,该文件被留空,而不会写入该文件。 您认为我需要执行 fflush (buf)操作、以便在将缓冲区写入文件后清除缓冲区。 我不认为情况可能是这样,因为我验证数据是否被覆盖,所以从 buf 方面看没有任何内容。

    谢谢、

    Shivam

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

    是的、我建议您调用 fflush 将数据刷新为文件、您还需要在删除 SD 卡以检查 PC 上的文件之前检查是否关闭了文件。

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

    我尝试了松露,但它仍然不起作用。  是的、我每次写入数据后都会关闭该文件。 问题是每个新字符串都会覆盖文件中先前写入的字符串。 请查看我的以下代码。  我注意到的另一件事是、当我使用 fwrite (buf、2、strlen (buf)、src)时;而不是 fwrite (buf、1、 strlen (buf)、src);我在2个字符串后得到光标(文件指针)、但一个字符串为空、如图所示。

    void *alarmThread (void *arg0)
    {
    mqd_t * mqdes = arg0;
    Int msg;
    uint32 sleepTickCount;
    sleepTickCount = 100000 / Clock_tickPeriod;
    SDFatFS_Handle sdfatfsHandle;
    文件*src;
    SDFatFS_init();
    add_device (fatfsPrefix、_MSA、ffcio_open、ffcio_close、ffcio_read、
    ffcio_write、ffcio_lseek、ffcio_unlink、ffcio_rename);
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    sdfatfsHandle = SDFatFS_open (CONFIG_SDFatFS_0、DRIVE_NUM);
    
    
    while (mq_receive (* mqdes、(char *)&msg、sizeof (msg)、NULL)!=-1)
    {
    src = fopen (inputfile、"w+");
    fseek (src、0、seek_end);
    //fwrite (&I、1、1、src);
    fwrite (textarray、1、strlen (textarray)、src);
    fwrite (buf、1、strlen (buf)、src);
    fflush (stdin);
    fclose (src);
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    Task_sleep (sleepTickCount);
    }
    
    SDFatFS_Close (sdfatfsHandle);
    
    返回(0);
    } 

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

    我曾建议您在 while 循环的外部执行 fopen/fclose 操作、以避免在每次写入缓冲区时出现 fseek、但您似乎不采用它。

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

    否否我尝试过我在这里告诉过这个:请查看下图。 当我在循环时在外部执行 fopen/fclose 时、不会向文件写入任何内容。

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

    我认为您不会因 fopen/fclose 而导致此问题。 从卡架中取出 SD 卡之前,您必须关闭文件。

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

    您能建议我为 cc26xx 读取驱动程序文档吗?

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

    据我所知,没有专门的文件可以解决这一问题。

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

    好的。

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

    大家好、我在 tirtos 文档中的 fatfs 用法部分中发现了这一点、fatsfs API 只能在特定扇区位置写入数据、因为该字符串将被覆盖?
    请参阅随附的图像。

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

    我看不到描述与您的问题之间的关系。

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

    好的、也请查看这一点、您认为这会影响我的代码中同时使用 CIO API 和 FATF API。

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

    在 fatsd 示例中、您可以看到"const char outputfile[]="fat:"STR (drive_NUM)":output.txt;"、它已经满足了这一要求。

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

    不是、我讨论的是图像中突出显示的文本。  

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

    我看不到您使用其他混合 API、对吧?

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

    但我使用的是 fflush 和 fwrite、两者均来自 stdio.h 和 Fatfs。

    无论如何、我会学习更多内容并进行检查。

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

    原始 fatsd 示例使用 fflush 和 fwrite、因此它应该有问题。

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

    还可以、但原始 fatsd 示例不会在 SD 卡中写入大数据。 该示例是否适合将大量数据写入 SD 卡?

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

    为什么不呢? 我使用示例代码将大数据写入 SD 卡没有问题。

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

    好的、我不知道是什么阻止了我。

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

    打开文件、写入数据和关闭文件时,应用程序登录中必须有错误。 您有耐心地跟踪和调试您的应用。

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

    确定您认为我需要以附加模式打开文件吗?

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

    它取决于您是否要覆盖它。

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

    但是、append 模式用于在文件末尾追加数据、而不是将其覆盖。 我是对的吗?

    fopen 在附加模式下的以下用法是否正确?

    fopen (inputfile、"A"); 

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

    我认为您需要使用 w+属性并 fseek 到文件末尾才能继续写入。

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

    谢谢您,yikai,您可以在附加模式下使用 fwrite 来解决该问题。

    非常感谢您的所有帮助。