打印
[STM32F3]

请教个sprintf函数问题

[复制链接]
678|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
负熵|  楼主 | 2022-12-12 12:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
想玩个rtc时间显示,在格式化时间时用了sprintf函数,最后出来的结果一直不对,请教下是哪里的问题。
uchar t=0;
   
    char time_display[30],time_display_hour[2],time_display_min[2],time_display_sec[2];
    if(t!=calendar.sec)
    {
      
      t=calendar.sec;
      if(calendar.hour<=9)
      {
        sprintf (time_display_hour,"0%d",calendar.hour);
      }
      else
      {
        sprintf (time_display_hour,"%d",calendar.hour);
      }
      if(calendar.min<=9)
      {
        sprintf (time_display_min,"0%d",calendar.min);
      }
      else
      {
        sprintf (time_display_min,"%d",calendar.min);
      }
      if(calendar.sec<=9)
      {
        sprintf (time_display_sec,"0%d",calendar.sec);
      }
      else
      {
        sprintf (time_display_sec,"%d",calendar.sec);
      }
      
      
      sprintf (time_display,"%d:%d:%d",time_display_hour,time_display_min,time_display_sec);
      display_GB2312_string(1,1,time_display);



使用特权

评论回复
沙发
Pretext| | 2022-12-12 14:07 | 只看该作者
哪里出问题了?第一个显示的是【\0】?

使用特权

评论回复
板凳
jerkoh| | 2022-12-12 14:38 | 只看该作者
没细看,结束就是0x00,  注意时间是不是BCD码   HEX吗转换显示问题

使用特权

评论回复
地板
负熵|  楼主 | 2022-12-12 17:59 | 只看该作者
jerkoh 发表于 2022-12-12 14:38
没细看,结束就是0x00,  注意时间是不是BCD码   HEX吗转换显示问题

获取的时,分,秒是calendar.hour,calendar.min,calendar.sec,如果是
sprintf (time_display,"%d:%d:%d",calendar.hour,calendar.min,calendar.sec);
可以正常显示,就是小于10时10分10秒之显示一位,感觉不好看,想做成0x的格式,结果显示的内容就这样了。

使用特权

评论回复
5
luobeihai| | 2022-12-12 22:26 | 只看该作者
本帖最后由 luobeihai 于 2022-12-12 22:40 编辑

你这个代码问题也太多了吧。
1、你想格式化时间输出,小于10的时候,前面你想补0,这样好看。那你可以用格式 %02d控制格式化输出啊。
sprintf (time_display_hour,"%02d",calendar.hour);
sprintf (time_display_min,"%02d",calendar.min);
sprintf (time_display_sec,"%02d",calendar.sec);

这样子不就少了很多无用的代码了么。

2、你定义的 time_display_hour[2],time_display_min[2],time_display_sec[2]; 这几个局部变量,都是2字节的。但是你的 calendar.hour/min/sec 这个结构体的成员变量,他们的范围是多少。很明显不可能只有2字节(就算是char型,最大也可能转换成3字节字符串),这样转换之后输出的字符串就不止2字节了。而你就这样存储到2个字节的变量中,肯定内存越界了啊。你可以把那几个时分秒的数组定义大一些。

使用特权

评论回复
6
jerkoh| | 2022-12-13 08:13 | 只看该作者
本帖最后由 jerkoh 于 2022-12-13 08:18 编辑
负熵 发表于 2022-12-12 17:59
获取的时,分,秒是calendar.hour,calendar.min,calendar.sec,如果是
sprintf (time_display,"%d:%d:% ...

PCF8563 ,BCD时间 如下 参考
typedef struct
{
        unsigned char RTC_Hours;  //小时
        unsigned char RTC_Minutes;  //分钟
        unsigned char RTC_Seconds;  //秒钟
        unsigned char Reseved;  //保留
}_PCF8563_Time_Typedef;


typedef struct
{
        unsigned char RTC_Years;  //年份
        unsigned char RTC_Months;  //月份
        unsigned char RTC_Days;  //日期
        unsigned char RTC_WeekDays;  //星期,数值范围:0 ~ 6
}_PCF8563_Date_Typedef;



_PCF8563_Time_Typedef* HMS;
_PCF8563_Date_Typedef* YWMD;

char text[32];
//          YWMD->RTC_Years=0x22;   //22年
//          YWMD->RTC_Months=0x11;  //11月
//          YWMD->RTC_Days=0x05;   //5日
//          YWMD->RTC_WeekDays=0x06; //周六
//          HMS->RTC_Hours=0x17;  //17时
//          HMS->RTC_Minutes=0x58;  //58分
//          HMS->RTC_Seconds=inc_cnt++;
    sprintf(text, "20%02X", YWMD->RTC_Years);
    sprintf(text + 4, "-%02X", YWMD->RTC_Months);
    sprintf(text + 7, "-%02X", YWMD->RTC_Days);
    sprintf(text + 10, " %02X", HMS->RTC_Hours);
    sprintf(text + 13, ":%02X", HMS->RTC_Minutes);
    sprintf(text + 16, ":%02X", HMS->RTC_Seconds);
显示text   2022-11-05  17:58:01


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

78

帖子

0

粉丝