工具/软件:Code Composer Studio
如何使用 system_printf ()将数据从 UART 显示到控制台中;命令。 我能否将 UART 数据接收到变量中?
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
如何使用 system_printf ()将数据从 UART 显示到控制台中;命令。 我能否将 UART 数据接收到变量中?
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
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
Shivam、
UART_READ()将数据放入缓冲区。
参数 句柄由 UART_open() 缓冲区返回的 UART_Handle指向应向其写入接收数据的空缓冲区的指针 大小要写入缓冲区的字节数 返回 已从 UART 读取的字节数,UART_STATUS_ERROR 在出错时返回。
此致、
Daniel
Shivam、
请阅读 system_pintf()的文档。 您需要传递字符串、因此需要将缓冲区从字符数组转换为字符串。
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 (¶ms); 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、¶ms); //从 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)打印缓冲区。
我是对的吗?
提前感谢。
好的、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
Shivam、
这显示在上面链接的文档中。
UART_Handle handle; UART_Params 参数; uint8_t rxBuf[100]; //接收缓冲 器 uint32_t timeoutU= 5000;// 5ms 超时、默认超时不是超时(BIOS_WAIT_FOREVER) // Init UART 并指定非默认参数 UART_PARAMS_INIT (¶ms); params.baudate = 9600; params.writeDataMode = UART_DATA_binary; params.readTimeout = timeoutU/ ClockP_getSystemTickPeriod ();//默认节拍周期为10us //打开 UART 并执行读取 句柄= UART_open (CONFIG_UART、¶ms); int Bytes = UART_read (handle、rxBuf);
这使得缓冲区成为一个100字节数组(uint8_t rxBuf[100];)并且 uart_read ()将100字节读入 rxBuf (int rxBytes = UART_Read (handle、rxBuf、100);)
Daniel
您将 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 相关代码、则不会卡在此处。
在循环中关闭 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()返回的状态是什么? 手柄是否打开正常?
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
感谢 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、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); }