OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7567|回复: 10

ucgui和ucos下f_open出错

[复制链接]

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
发表于 2013-6-12 15:47:29 | 显示全部楼层 |阅读模式
             在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的执行频率
}

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-12 17:06:11 | 显示全部楼层
void Task_TextBrowser(void *pdata)

WM_HWIN hWM;
OS_CPU_SR cpu_sr;
u16 br = 0;

u8 File_Buffer[1024];


函数里面放这么大个数组,不死机才怪.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-12 17:50:57 | 显示全部楼层
      改过来还是不行,我估计不是哪里的错,File_Buffer只是存储读取数据的缓冲区的指针 ,我要读的文件有时候会大一点。但是改过来以后,依然在f_open就死机了,不能运行到f_read。fatfs文件最大一次可以读多大的文件啊
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 10:35:55 | 显示全部楼层
我以前还是有可能打开txt文件,现在总是在f_open出错,
if (fs->fs_type) { /* If the logical drive has been mounted */
stat = disk_status(fs->drv);
if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */
if (!_FS_READONLY && chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */
return FR_WRITE_PROTECTED;
return FR_OK; /* The file system object is valid */
运行到if这里是进入硬件错误中断(HardFault_Handler)
是不是芯片的内存不够,我用的是107的芯片。
求指教啊。
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 16:49:54 | 显示全部楼层
找到原因了,看来是芯片的内存太小了,打不开文件
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 20:46:29 | 显示全部楼层
请教大神一下,我想TXT文件里面写的数据,程序是这样
f_open(&fsrc, "0:/TEXT/2321.txt", FA_OPEN_ALWAYS | FA_WRITE|FA_READ);
while(1)
{
OS_ENTER_CRITICAL(); 
//OSSchedLock();//上锁
f_write(&fsrc, fat, sizeof(fat)-1, &bw); 
  f_write(&fsrc, "\r\n", sizeof("\r\n"), &bw);
//f_close(&fsrc);
   f_sync(&fsrc);//冲洗函数指针,文件仍处于打开状态
OS_EXIT_CRITICAL();
//OSSchedUnlock();//开锁

OSTaskResume(ADCMenu_STK_Prio);//运行任务
OSTimeDly(1000); //10s运行一次
  }
我自己建的txt文件,用f_read打开txt文件,可以读到里面的数据,但是我打开上面的txt文件里面什么也没有,在电脑上打开这个文件是有数据的,到底是什么问题啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-13 21:16:56 | 显示全部楼层
你上面的代码,看起来就有问题.
f_close都没有.
是没法成功写入文件的.
另外,  f_sync(&fsrc);//冲洗函数指针,文件仍处于打开状态
这个函数我从来没用过,表示不用这个函数,可以很好的实现我要的功能.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 22:16:57 | 显示全部楼层
比较悲剧,我如果用f_close,只能写一组数据,或者就没有数据。但是我用 f_sync的话可以连续写数据
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-13 22:19:01 | 显示全部楼层
f_close是文件写入结束才用一次的,不是叫你写一句,就f_close....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 22:26:33 | 显示全部楼层
问题是我要重复写入数据写数据的任务,当这个任务重新运行时数据就没有了,有重新记录。我做的实验要求是实时记录数据的
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 22:32:04 | 显示全部楼层
我本来是把写数据的任务放在AD采集任务中的,但是一运行到这里就死机了,可能是内存太小的缘故,我重新建个任务用来写数据,但是就出现上面的问题。
非常感谢原子大神的帮助,太晚了,我要回去睡觉了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表