中级会员
 
- 积分
- 262
- 金钱
- 262
- 注册时间
- 2020-10-3
- 在线时间
- 19 小时
|
1金钱
路过的各位大神,我移植了http://www.openedv.com/forum.php ... hlight=%B2%CB%B5%A5这位大神的LCD菜单,但是我发神用在设置时间中用了sprintf 就无法返回主菜单了,调试发现系统运行到了错误中断里!
- void testdis()
- {
- uint8_t encode;
- uint8_t t;
- char str[1] = {0};
- ClearDisplay();
- while(1)
- {
- encode = encoder_read();
- if(encode)
- {
- if(encode == 4)
- {
- break;
- }
- if(encode==1)
- {
- t++;
- }
- if(encode==2)
- {
- t--;
- }
-
- }
-
-
- Disp_String_Menu(32,0,(uint8_t *)"时间设置",16,0,0);
- sprintf(str,"test: %d",t); //<font color="#ff0000">如果注释这句,下面那句直接用一个字符串就能返回到主菜单,请问这里什么原因???</font>
- LCD_P5x8Str(10,2,(uint8_t *)str);
-
- }
-
- }
- //显示菜单项
- void ShowMenu(uint8_t line) //显示菜单项并设置选中的项反白
- {
- int i;
- line = 3-(currentMenu->range_to-line);
- for(i = 0;i<4;i++)
- {
- if(i==line){
- Disp_String_Menu(5,i,(uint8_t *)currentMenu->menuItems[i+currentMenu->range_from],16,1,0);
- }else{
- Disp_String_Menu(5,i,(uint8_t *)currentMenu->menuItems[i+currentMenu->range_from],16,0,0);
- }
- }
- }
- void func(void)
- {
- printf("hello\r\n");
- }
- void initMenu()
- {
- MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);
- MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数
- MainMenu.subMenus[1] = NULL;
- MainMenu.subMenus[2] = NULL;
- MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单
- MainMenu.func = malloc(sizeof(&func)*4);
- MainMenu.func[0] = NULL;
- MainMenu.func[1] = NULL;
- MainMenu.func[2] = &testdis;//当选择了并按了确定,会执行func函数
- MainMenu.func[3] = NULL;
- MainMenu.parent = NULL;//表示是顶级菜单
-
- searchMenu.subMenus = malloc(sizeof(&searchMenu)*6);
- searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL;
- searchMenu.func = malloc(sizeof(&printf)*6);
- searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL;
- searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单 项
-
- currentMenu = &MainMenu;
-
- }
- /**************************************************************
- * 函数说明:Flash处理目录初始化函数 *
- **************************************************************/
- void MenuTree(void)
- {
-
- encode = encoder_read();
-
- if (encode==4)
- {
- ClearDisplay();
- ShowMenu(currentMenu->selected);
- while(1)
- {
- encode = encoder_read();
- switch(encode)
- {
- case 2://向右
- if(currentMenu->selected == 0)//到了第一项
- break;
- else
- {
- currentMenu->selected--;
- if(currentMenu->selected < currentMenu->range_from)//更新显示的区域
- {
- currentMenu->range_from = currentMenu->selected;
- currentMenu->range_to = currentMenu->range_from+3;
- }
- ClearDisplay();
- ShowMenu(currentMenu->selected);
- break;
- }
- case 1://向左
- if(currentMenu->selected == currentMenu->itemCount-1)
- break;
- else
- {
- currentMenu->selected++;
- if(currentMenu->selected>currentMenu->range_to)
- {
- currentMenu->range_to = currentMenu->selected;
- currentMenu->range_from = currentMenu->range_to-3;
- }
- ShowMenu(currentMenu->selected);
- break;
- }
- case 3://Enter键
- {
- if(currentMenu->subMenus[currentMenu->selected] !=NULL)
- {
- currentMenu = currentMenu->subMenus[currentMenu->selected];
- ClearDisplay();
- ShowMenu(0);
- }
- else
- {
- if(currentMenu->func[currentMenu->selected] != NULL)
- {
- currentMenu->func[currentMenu->selected]();//执行相应的函数
- ClearDisplay();
- ShowMenu(currentMenu->selected);//返回后恢复原来的菜单状态
- }
- }
- break;
- }
- case 4://返回键
- {
- if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单
- {
- currentMenu = currentMenu->parent;
- ClearDisplay();
- ShowMenu(currentMenu->selected);
- }
- break;
- }
- default:
- break;
- }
-
- }
- }
- }
复制代码 问题就是出在无法返回主菜单,直接显示一个字符串是可以返回的,但是如果用sprintf就无法返回了???在线等,求大神指点一下!
|
最佳答案
查看完整内容[请看2#楼]
sprintf(str,"test: %d",t);
str的字节长度只有1,啥都存不了,缓存溢出了,str缓存要搞大!
这两天连续看到有人使用sprintf后导致缓存溢出。
再说一遍吧,不要用sprintf,这个API不安全,用snprintf安全点。
|