嵌入式技术论坛
直播中

fansz

8年用户 1243经验值
擅长:制造/封装
私信 关注
[问答]

怎样去解决LCD打印RTC时间报总线错误的问题呢?

事情是这样的,我在RTT中添加了LCD显示,将ctime(&now)格式化后的时间字符串打印出来,没问题,使用LCD显示函数打印直接报总线错误。会显示第一次的时间,之后就报总线错误。下面是我的代码:注释部分是报错的代码,前面的代码是可以正常打印到LCD的。
报错串口打印的信息:

2.jpg

/led 线程/
void led1_thread_entry(void* parameter)
{
ILI9806G_DispStringLine_EN(LINE(0),"time");
LCD_SetFont(&Font16x32);
LCD_SetColors(RED,YELLOW);
time_t now;
char buf[100];
buf[0] = '\0';
char time2lcd[25] = {0};
time2lcd[0] = '\0';
struct tm tm_now;
struct tm nowtime;
while(1)
{
/
获取时间 */
now = time(RT_NULL);//获取的是一个秒数;
tm_now = localtime(&now);
memcpy(&nowtime, tm_now, sizeof(struct tm));
rt_kprintf("%d-%d-%d-%d,%d:%d:%d\r\n", nowtime.tm_year+1900,nowtime.tm_mon+1,nowtime.tm_mday,nowtime.tm_wday,nowtime.tm_hour,nowtime.tm_min,nowtime.tm_sec);
sprintf(buf, "%04d-%02d-%02d,%d:%d:%d", (int)(nowtime.tm_year + 1900), (int)(nowtime.tm_mon + 1), (int)nowtime.tm_mday,nowtime.tm_hour,nowtime.tm_min,nowtime.tm_sec);
rt_kprintf("%s\r\n", buf);
ILI9806G_DispStringLine_EN(LINE(7),buf);
// strcat(time2lcd,ctime(&now));//将ctime(&now)格式化后的时间字符拷贝到字符串time2lcd
// rt_kprintf("%s\r\n", time2lcd);//打印到串口
// rt_kprintf("%d\r\n", strlen(time2lcd));//测量长度为25
// ILI9806G_DispStringLine_EN(LINE(2), time2lcd);//打印到显示器,会打印一次然后报错
// memset(time2lcd,'\0',strlen(time2lcd));//字符数组清零。
//
rt_thread_mdelay(1000);
}
}

回帖(5)

陈敏

2023-1-11 14:27:54
strcat(time2lcd,ctime(&now));
time2lcd 没清理,继续追加,第二次数组长度不够,越界写了
举报

fansz

2023-1-11 14:28:04
清理了,我专门打印了长度。就是为了验证数组没有越界。
举报

fansz

2023-1-11 14:28:09
倒数第二行用memset清理了。
举报

陈敏

2023-1-11 14:28:21
rt_kprintf("%drn", strlen(time2lcd));//测量长度为25 这一句打印出来的值是25?
如果是25那还是越界了一个字符
举报

刘丹

2023-1-11 14:28:29
我碰到这种要么是访问到空指针或者数组越界,要么是线程栈太小,你可以试试调大分配的线程栈,或者查一查函数调用堆栈,单步看看是不是访问越界的问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分