串口上位机设置RTC时间进行校准
方式1:发送固定格式时间解析
代码:
#include <stdio.h>
#include <string.h>
/*
当在格式字符串中使用 `%*[^:]` 时,它表示在读取输入时跳过冒号 `:` 之前的任何字符。
%*:星号 * 表示读取输入但不将其存储到变量中,而是跳过该部分的内容。
[^:]:方括号 []表示一个字符集,其中 ^ 表示取反。在这个字符集中,我们指定了一个冒号 : 以外的任何字符。
因此,%*[^:] 表示在读取输入时跳过冒号 : 之前的任何字符。这在上述示例中用于跳过字符串中的 "Set Time:" 部分,以便我们只提取日期和时间部分。
这种格式说明符的使用非常方便,可以帮助我们在读取输入时忽略或跳过特定的字符或字符串部分,而不必将其存储到变量中。
*/
int main(void)
{
char input[100]; // 假设输入的字符串不超过 100 个字符
int Year, Month, Day, Hour, Minute, Second;
printf("请输入时间字符串要求样例如下:\r\n");
printf("Set Time:2023-06-18 23:25:36 \r\n");
fgets(input, sizeof(input), stdin);
// 从输入的字符串中提取年、月、日、小时、分钟和秒
sscanf(input, "%*[^:]:%d-%d-%d %d:%d:%d", &Year, &Month, &Day, &Hour, &Minute, &Second);
printf("Year: %d\n", Year);
printf("Month: %d\n", Month);
printf("Day: %d\n", Day);
printf("Hour: %d\n", Hour);
printf("Minute: %d\n", Minute);
printf("Second: %d\n", Second);
return 0;
}
方式1:测试效果
方式2:发送设置时间的时间戳
代码:
#include <stdio.h>
#include <string.h>
#include <time.h>
/*时间戳是从特定时间点(例如UNIX纪元时间)开始计算的秒数。时间戳的值通常是一个长整型(long)数值。*/
int main(void)
{
char input[100]; // 假设输入的字符串不超过 100 个字符
int Year, Month, Day, Hour, Minute, Second;
time_t timestamp;
printf("请输入时间戳要求样例如下:\r\n");
printf("Set Time:%ld\r\n",(time_t)time(NULL));
fgets(input, sizeof(input), stdin);
// 将时间戳转换为 time_t 类型
sscanf(input, "Set Time:%ld", ×tamp);
// 将 time_t 类型的时间戳转换为 struct tm 结构体
struct tm* timeinfo = localtime(×tamp);
Year = timeinfo->tm_year + 1900;
Month = timeinfo->tm_mon + 1;
Day = timeinfo->tm_mday;
Hour = timeinfo->tm_hour;
Minute = timeinfo->tm_min;
Second = timeinfo->tm_sec;
printf("Year: %d\n", Year);
printf("Month: %d\n", Month);
printf("Day: %d\n", Day);
printf("Hour: %d\n", Hour);
printf("Minute: %d\n", Minute);
printf("Second: %d\n", Second);
return 0;
}
方式2:测试效果
有关时间戳的概念大家可以参考之前文章
https://blog.csdn.net/weixin_43176183/article/details/131191018
代码仅仅在Dev平台上测试,具体设置还要在硬件上进行验证!