在ucgui和ucos下运行一个任务,打开TXT出错,程序死在f_open上,FIL f_file定义在函数外面也不行,应该也不是堆栈过小,我以前可以打开TXT的但是程序添加了一部分以后就不行了,到现在也回不去了,请大神指教啊。
附上我的程序:
#include "TextBrowser.h"
#include "APP.h"#define Exit 1
#define OpenFile 2
#define Back 3
//extern u8 Exit_Browser;
u8 Exit_Browser;
char buf1[];
FIL f_file;
//FATFS fs[2];
/********************************************建立资源表**************************************************/
const GUI_WIDGET_CREATE_INFO TextBrowseDialog[] = {
{ FRAMEWIN_CreateIndirect,"TEXT",0,0,0,240,320,FRAMEWIN_CF_MOVEABLE},//建立框架窗口
{ LISTBOX_CreateIndirect,0,GUI_ID_LISTBOX0,2,4,231,262,WM_CF_SHOW},//从资源表条目追踪列表框
{ BUTTON_CreateIndirect,"Open",Button_ID8,40, 270,50, 25},//从资源表项目中建立按钮
{ BUTTON_CreateIndirect,"Exit",Button_ID9,130,270,50,25}
};
const GUI_WIDGET_CREATE_INFO TextViewDialog[] = {
{ FRAMEWIN_CreateIndirect,"",0,0,0,240,320,FRAMEWIN_CF_MOVEABLE},
{ MULTIEDIT_CreateIndirect,0,GUI_ID_MULTIEDIT0,2,4,231,262,WM_CF_SHOW},
{ BUTTON_CreateIndirect,"Up",Button_ID7,2, 270,60, 25},
{ BUTTON_CreateIndirect,"Exit",Button_ID8,90, 270,60, 25},
{ BUTTON_CreateIndirect,"Down",Button_ID9,173,270,60,25}
};
/**********************************************************************************************************
** Function name: TextBrowseCallBack
** Descriptions: 文本列表对话框回调函数
** input parameters: WM_MESSAGE *pMsg:消息
** output parameters: 无
** Returned value: 无
**********************************************************************************************************/
static void TextBrowseCallBack(WM_MESSAGE *pMsg)
{
int Id,NCode;
char buf[30];
// u16 file_num = 0;
LISTBOX_Handle hListBox;
WM_HWIN hWin = pMsg->hWin;
hListBox = WM_GetDialogItem(hWin,GUI_ID_LISTBOX0);//返回一个对话话项目(控件)的窗口句柄
switch(pMsg -> MsgId) {
case WM_INIT_DIALOG:
MenuDisnable++;
LISTBOX_SetAutoScrollV (hListBox, 1);//设置上下自动滚动空控件
// FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT,0);
FRAMEWIN_AddMaxButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);//增加最大化窗口按钮
FRAMEWIN_AddMinButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);//增加最小化窗口按钮
FatFs_Open("0:/TEXT");//打开SD卡,获取根目录列表
for(Id = 2;Id < filecount;Id++)
{ //前两项是“.”和“..”目录项,应跳过。
LISTBOX_AddString(hListBox, (char*)FileList[Id]);//添加字符串的列表框
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg ->hWinSrc);//控件的 Id
NCode = pMsg ->Data.v;
switch(NCode) {
case WM_NOTIFICATION_RELEASED:
if (Id == Button_ID8) {//打开open按钮
strcpy(buf1,"0:/TEXT/");//把从src(0:/TEXT/)地址开始且含有NULL结束符的字符串复制到以buf1开始的地址空间
LISTBOX_GetItemText(hListBox,LISTBOX_GetSel(hListBox),buf,30);//LISTBOX_GetSel返回所选择行的数目,获取文本的列表框
buf1[8] = '\0';
strcat(buf1,buf);//把buf所指字符串添加到buf1结尾处(覆盖buf1结尾处的'\0')并添加'\0'。
ClearPath(FilePath);
Exit_Browser = OpenFile;
GUI_EndDialog(pMsg->hWin, 1);//结束一个对话框
MenuDisnable--;
} else if(Id == Button_ID9) {//打开exit按钮
ClearPath(FilePath);
Exit_Browser = Exit;
GUI_EndDialog(pMsg->hWin, 1);//结束一个对话框
MenuDisnable--;
}
break;
default:
break;
}
break;
default:
WM_DefaultProc(pMsg);//处理信息的默认函数
break;
}
}
/**********************************************************************************************************
** Function name: TextViewCallBack
** Descriptions: 文本列表对话框回调函数
** input parameters: WM_MESSAGE *pMsg:消息
** output parameters: 无
** Returned value: 无
**********************************************************************************************************/
static void TextViewCallBack(WM_MESSAGE *pMsg)
{
int Id,NCode;
switch(pMsg -> MsgId) {
case WM_INIT_DIALOG:
MenuDisnable++;
// FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT,0);
FRAMEWIN_AddMaxButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);//增加最大化窗口按钮
FRAMEWIN_AddMinButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);//增加最小化窗口按钮
FRAMEWIN_SetText(pMsg->hWin, (const char*)buf1);//设置标题文本
MULTIEDIT_SetReadOnly(WM_GetDialogItem(pMsg->hWin,GUI_ID_MULTIEDIT0), MULTIEDIT_CF_READONLY);//设置成只读模式
MULTIEDIT_SetFont(WM_GetDialogItem(pMsg->hWin,GUI_ID_MULTIEDIT0),&GUI_Font24_ASCII); // 设置字体
MULTIEDIT_SetAutoScrollH(WM_GetDialogItem(pMsg->hWin,GUI_ID_MULTIEDIT0), 1);//设置左右自动滚动空控件
MULTIEDIT_SetAutoScrollV(WM_GetDialogItem(pMsg->hWin,GUI_ID_MULTIEDIT0), 1);//设置上下自动滚动空控件
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg ->hWinSrc);//获取控件的 Id
NCode = pMsg ->Data.v;
switch(NCode) {
case WM_NOTIFICATION_RELEASED:
if (Id == Button_ID7) {//设置向上翻
} else if(Id == Button_ID8) {//设置退出
Exit_Browser = Back;
GUI_EndDialog(pMsg->hWin, 1);
MenuDisnable--;
} else if(Id == Button_ID9) {//设置向下翻
}
break;
default:
break;
}
break;
default:
WM_DefaultProc(pMsg);//处理信息的默认函数
break;
}
}
/**********************************************************************************************************
** Function name: Task_TextBrowser
** Descriptions: 文本浏览器任务
** input parameters: void *pdata
** output parameters: 无
** Returned value: 无
**********************************************************************************************************/
void Task_TextBrowser(void *pdata)
{
WM_HWIN hWM;
OS_CPU_SR cpu_sr;
u16 br = 0;
u8 File_Buffer[1024];
GUI_CreateDialogBox(TextBrowseDialog, GUI_COUNTOF(TextBrowseDialog), TextBrowseCallBack, 0, 0, 0);
//建立一个非阻塞式的对话框,0(表示没有父窗口),0(x),0(y)
//TextBrowseDialog(定义包含在对话框中所有控件的资源表的指针)
//GUI_COUNTOF(包含在对话框中所有控件的数量)
//TextBrowseCallBack(回调函数的指针)
Exit_Browser = 0;
/*******************************************************************************************************/
while(1){
if(TouchCmd == 1){
TouchCmd = 0;
}
if(Exit_Browser == Back){
Exit_Browser = 0;
GUI_CreateDialogBox(TextBrowseDialog, GUI_COUNTOF(TextBrowseDialog), TextBrowseCallBack, 0, 0, 0);
//建立一个非阻塞式的对话框
}
if(Exit_Browser == Exit){//按文件浏览的exit的按钮,退出进入主界面
WM_SetDesktopColor(DesktopColor);//设置背景颜色
Go_MainMenu(); //进入主界面
OSTaskDel(OS_PRIO_SELF); //删除自己
//OSTaskResume(ADCMenu_STK_Prio);//运行任务
//OSTaskResume(ADPut_STK_Prio);//运行任务
} else if(Exit_Browser == OpenFile) {//打开文档
Exit_Browser = 0;
OS_ENTER_CRITICAL(); //宏,进入临阶段
f_open(&f_file,(const TCHAR*)buf1,FA_READ);//打开文件
f_read(&f_file,File_Buffer,1020,(UINT*)&br);
f_close(&f_file);//关闭文件
OS_EXIT_CRITICAL();//宏,退出临界段(开中断)
buf1[1023] = 0;
WM_SetDesktopColor(DesktopColor);//设置背景颜色
GUI_Exec();//重绘
hWM = GUI_CreateDialogBox(TextViewDialog, GUI_COUNTOF(TextViewDialog), TextViewCallBack, 0, 0, 0);
//建立一个对话框
MULTIEDIT_SetText(WM_GetDialogItem(hWM,GUI_ID_MULTIEDIT0), (const char*)File_Buffer);
//WM_GetDialogItem返回一个对话框项目(控件)的窗口句柄
//设置MultiEdit的显示文本,MULTIEDIT,可以多行输入
}
OSTimeDly(10); //保证50Hz的执行频率
}
} |