Thread 中讨论的其他器件:SysConfig
工具/软件:Code Composer Studio
大家好、我正在将字符从 UART 读取到 cc2652中。 我使用 UART_READ (UART、INPUT、1) 一次接收一个字节的字符。 是否有任何函数可以接收字符串、直到出现诸如'\n'之类的特定字符。 请建议是否有与 readstringuntil ("\n")等效的内容。
谢谢、
Shivam
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.
工具/软件:Code Composer Studio
大家好、我正在将字符从 UART 读取到 cc2652中。 我使用 UART_READ (UART、INPUT、1) 一次接收一个字节的字符。 是否有任何函数可以接收字符串、直到出现诸如'\n'之类的特定字符。 请建议是否有与 readstringuntil ("\n")等效的内容。
谢谢、
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 卡文件中。
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);
此致、
我已从您之前建议的伪代码中获取此器件、如下所示。 接收到"\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[] 中收集的任何操作
好的、现在正如您先前所建议的、我没有在 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,这是因为你非常感谢你,我对我以前的粗鲁行为表示歉意。
我尝试了松露,但它仍然不起作用。 是的、我每次写入数据后都会关闭该文件。 问题是每个新字符串都会覆盖文件中先前写入的字符串。 请查看我的以下代码。 我注意到的另一件事是、当我使用 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); }