/* ***************************************************************** 头文件 ***************************************************************** */ #include "bsp.h" /* ************************************************************************************ 变量定义 ************************************************************************************ */ data_common data_common1; FIL fp; /* Pointer to the blank file object */ FATFS fs1; UINT btw; /* Number of bytes to write */ UINT bws; u32 send_pos=0; DIR DirInf; FILINFO FileInf; char name[20]="\0"; char Tf_Read_Buff[max_transmission+15],Send_Buf[max_transmission+15] = {'\0'},Temp_Buf[max_transmission+15] = {'\0'}; /* ********************************************************************************************************* * 函 数 名: FATFS_WriteFile() * 功能说明: TF卡数据写入 * 输 入 :文件名 fname 数据 dat 长度 len * 输 出 :无 ********************************************************************************************************* */ void FATFS_WriteFile(char *fname,char *dat,u16 len) //写数据到SD卡 { UINT br; char name[20]; sprintf(name,"%s%s",fname,".txt"); f_mount(&fs1, "0:", 1); f_open (&fp,fname,FA_READ|FA_WRITE|FA_OPEN_ALWAYS); f_lseek(&fp,f_size(&fp)); //移动到文件的末尾--追加数据 f_write(&fp,dat,len,&br); f_close(&fp); f_mount(NULL, DiskPath, 0); } /* ********************************************************************************************************* * 函 数 名: Data_Write_TF() * 功能说明: TF卡数据写入 时间、电压、经纬度、海拔、传感器数据 * 输 入 :无 * 输 出 :无 ********************************************************************************************************* */ FRESULT Data_Write_TF(void) { FRESULT res; u8 i=0; char hhmmss[8]={'\0'},yymmdd[8]={'\0'}; RTC_DateTypeDef dates; //RTC_GetDate(RTC_Format_BIN,&dates); //GetRTC(hhmmss,yymmdd); //sprintf(name,"%s_%s.txt",yymmdd,Init_Data_Equipment.Measure_Interval); f_mount(&fs1, "0:", 1); res=f_open(&fp,name,FA_WRITE); if((res==FR_NO_FILE)||(Init_Data_Equipment.par_change==1))//判断文件是否存在.不存在写入表头 { f_close(&fp); f_open(&fp,name,FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); f_lseek (&fp,f_size(&fp)); f_write(&fp,"Equipment_ID:",strlen("Equipment_ID:"),&bws); f_write(&fp,Init_Data_Equipment.Equipment_ID,strlen(Init_Data_Equipment.Equipment_ID),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"TCP_Ip:",strlen("TCP_Ip:"),&bws); f_write(&fp,Init_Data_Equipment.Bc25_Ip,strlen(Init_Data_Equipment.Bc25_Ip),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"TCP_Port:",strlen("TCP_Port:"),&bws); f_write(&fp,Init_Data_Equipment.Bc25_Port,strlen(Init_Data_Equipment.Bc25_Port),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Wifi_SSID:",strlen("Wifi_SSID:"),&bws); f_write(&fp,Init_Data_Equipment.ESP8266_AP_SSIDs,strlen(Init_Data_Equipment.ESP8266_AP_SSIDs),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Wifi_Pwd:",strlen("Wifi_Pwd:"),&bws); f_write(&fp,Init_Data_Equipment.ESP8266_AP_PWDs,strlen(Init_Data_Equipment.ESP8266_AP_PWDs),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Wifi_Port:",strlen("Wifi_Port:"),&bws); f_write(&fp,Init_Data_Equipment.ESP8266_AP_Ports,strlen(Init_Data_Equipment.ESP8266_AP_Ports),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Measure_Interval:",strlen("Measure_Interval:"),&bws); f_write(&fp,Init_Data_Equipment.Measure_Interval,strlen(Init_Data_Equipment.Measure_Interval),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Pub_Interval:",strlen("Pub_Interval:"),&bws); f_write(&fp,Init_Data_Equipment.Pub_Time,strlen(Init_Data_Equipment.Pub_Time),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Appointment_Time:",strlen("Appointment_Time:"),&bws); f_write(&fp,Init_Data_Equipment.appointment_time,strlen(Init_Data_Equipment.appointment_time),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Measure_Mode:",strlen("Measure_Mode:"),&bws); f_write(&fp,Init_Data_Equipment.measure_mode,strlen(Init_Data_Equipment.measure_mode),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Equipment_ID,DateTime,Power-V,Latitude,N/S,Longitude,E/W,Ch1-SoilT_C,Ch1-SoilVWC_%,Ch1-Soil_DS,Ch2-SoilT_C,Ch2-SoilVWC_%,Ch2-Soil_DS,Ch3-SoilT_C,Ch3-SoilVWC_%,Ch3-Soil_DS,Ch4-SoilT_C,Ch4-SoilVWC_%,Ch4-Soil_DS,Ch5-SoilT_C,Ch5-SoilVWC_%,Ch5-Soil_DS,Ch6-SoilT_C,Ch6-SoilVWC_%,Ch6-Soil_DS,qxz-Temperature_C,qxz-Humidity_%RH,qxz-AirPressure_hPa,qxz-WindSpeed_m/s,qxz-WindDirection_°,qxz-Rainfall_mm,qxz-Illuminance_lux\r\n", strlen("Equipment_ID,DateTime,Power-V,Latitude,N/S,Longitude,E/W,Ch1-SoilT_C,Ch1-SoilVWC_%,Ch1-Soil_DS,Ch2-SoilT_C,Ch2-SoilVWC_%,Ch2-Soil_DS,Ch3-SoilT_C,Ch3-SoilVWC_%,Ch3-Soil_DS,Ch4-SoilT_C,Ch4-SoilVWC_%,Ch4-Soil_DS,Ch5-SoilT_C,Ch5-SoilVWC_%,Ch5-Soil_DS,Ch6-SoilT_C,Ch6-SoilVWC_%,Ch6-Soil_DS,qxz-Temperature_C,qxz-Humidity_%RH,qxz-AirPressure_hPa,qxz-WindSpeed_m/s,qxz-WindDirection_°,qxz-Rainfall_mm,qxz-Illuminance_lux\r\n"),&bws); f_close(&fp); //qxz气象站数据(温度、湿度、气压、风速、风向、雨量、光照) //湿度 电导率 温度 } res=f_open(&fp,name,FA_READ | FA_WRITE | FA_OPEN_ALWAYS );//0:/ if(res!=FR_OK) //打开失败 { i=0; while((res!=FR_OK)&(i<100)) { i++; f_close(&fp); f_mount(NULL, DiskPath, 0); f_mount(&fs1, "0:", 1); res=f_open(&fp,name,FA_READ | FA_WRITE | FA_OPEN_ALWAYS );//0:/ } if(i>98)return FR_NO_PATH ; } f_lseek (&fp,f_size(&fp)); f_write(&fp,data_common1.Pack_data,strlen(data_common1.Pack_data),&bws); f_write(&fp,"\r\n",2,&bws); f_close(&fp); f_mount(&fs1, "0:", 1); res=f_open(&fp,"BC25.txt",FA_WRITE); /*************数据临时存储文件,用于BC25定时发送*******************************/ if((Init_Data_Equipment.par_change==1) || (res==FR_NO_FILE))//判断文件是否存在.不存在写入表头 //if((Init_Data_Equipment.par_change==1)||(Init_Data_Equipment.Bc25_Send_Header!=dates.RTC_Date))//判断文件是否存在.不存在写入表头 { //res=f_open(&fp,"BC25.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); Init_Data_Equipment.par_change=0; EEPROM_WriteBytes(185,0,1); EEPROM_WriteBytes(186,&dates.RTC_Date,1); f_close(&fp); f_open(&fp,"BC25.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); f_lseek (&fp,f_size(&fp)); f_write(&fp,"Equipment_ID:",strlen("Equipment_ID:"),&bws); f_write(&fp,Init_Data_Equipment.Equipment_ID,strlen(Init_Data_Equipment.Equipment_ID),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"TCP_Ip:",strlen("TCP_Ip:"),&bws); f_write(&fp,Init_Data_Equipment.Bc25_Ip,strlen(Init_Data_Equipment.Bc25_Ip),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"TCP_Port:",strlen("TCP_Port:"),&bws); f_write(&fp,Init_Data_Equipment.Bc25_Port,strlen(Init_Data_Equipment.Bc25_Port),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Wifi_SSID:",strlen("Wifi_SSID:"),&bws); f_write(&fp,Init_Data_Equipment.ESP8266_AP_SSIDs,strlen(Init_Data_Equipment.ESP8266_AP_SSIDs),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Wifi_Pwd:",strlen("Wifi_Pwd:"),&bws); f_write(&fp,Init_Data_Equipment.ESP8266_AP_PWDs,strlen(Init_Data_Equipment.ESP8266_AP_PWDs),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Wifi_Port:",strlen("Wifi_Port:"),&bws); f_write(&fp,Init_Data_Equipment.ESP8266_AP_Ports,strlen(Init_Data_Equipment.ESP8266_AP_Ports),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Measure_Interval:",strlen("Measure_Interval:"),&bws); f_write(&fp,Init_Data_Equipment.Measure_Interval,strlen(Init_Data_Equipment.Measure_Interval),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Pub_Interval:",strlen("Pub_Interval:"),&bws); f_write(&fp,Init_Data_Equipment.Pub_Time,strlen(Init_Data_Equipment.Pub_Time),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Appointment_Time:",strlen("Appointment_Time:"),&bws); f_write(&fp,Init_Data_Equipment.appointment_time,strlen(Init_Data_Equipment.appointment_time),&bws); f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Measure_Mode:",strlen("Measure_Mode:"),&bws); f_write(&fp,Init_Data_Equipment.measure_mode,strlen(Init_Data_Equipment.measure_mode),&bws); f_write(&fp,"\r\n",2,&bws); // f_write(&fp,"IOT_Username:",strlen("IOT_Username:"),&bws); // f_write(&fp,Init_Data_Equipment.measure_mode,strlen(Init_Data_Equipment.IOT_Username),&bws); // f_write(&fp,"\r\n",2,&bws); // f_write(&fp,"IOT_Password:",strlen("IOT_Password:"),&bws); // f_write(&fp,Init_Data_Equipment.measure_mode,strlen(Init_Data_Equipment.IOT_Password),&bws); // f_write(&fp,"\r\n",2,&bws); // f_write(&fp,"IOT_Theme_name:",strlen("IOT_Theme_name:"),&bws); // f_write(&fp,Init_Data_Equipment.measure_mode,strlen(Init_Data_Equipment.IOT_Theme_name),&bws); // f_write(&fp,"\r\n",2,&bws); f_write(&fp,"Equipment_ID,DateTime,Power-V,Latitude,N/S,Longitude,E/W,Ch1-SoilT_C,Ch1-SoilVWC_%,Ch1-Soil_DS,Ch2-SoilT_C,Ch2-SoilVWC_%,Ch2-Soil_DS,Ch3-SoilT_C,Ch3-SoilVWC_%,Ch3-Soil_DS,Ch4-SoilT_C,Ch4-SoilVWC_%,Ch4-Soil_DS,Ch5-SoilT_C,Ch5-SoilVWC_%,Ch5-Soil_DS,Ch6-SoilT_C,Ch6-SoilVWC_%,Ch6-Soil_DS,qxz-Temperature_C,qxz-Humidity_%RH,qxz-AirPressure_hPa,qxz-WindSpeed_m/s,qxz-WindDirection_°,qxz-Rainfall_mm,qxz-Illuminance_lux\r\n", strlen("Equipment_ID,DateTime,Power-V,Latitude,N/S,Longitude,E/W,Ch1-SoilT_C,Ch1-SoilVWC_%,Ch1-Soil_DS,Ch2-SoilT_C,Ch2-SoilVWC_%,Ch2-Soil_DS,Ch3-SoilT_C,Ch3-SoilVWC_%,Ch3-Soil_DS,Ch4-SoilT_C,Ch4-SoilVWC_%,Ch4-Soil_DS,Ch5-SoilT_C,Ch5-SoilVWC_%,Ch5-Soil_DS,Ch6-SoilT_C,Ch6-SoilVWC_%,Ch6-Soil_DS,qxz-Temperature_C,qxz-Humidity_%RH,qxz-AirPressure_hPa,qxz-WindSpeed_m/s,qxz-WindDirection_°,qxz-Rainfall_mm,qxz-Illuminance_lux\r\n"),&bws); f_close(&fp); } res=f_open(&fp,"BC25.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS );//0:/ if(res!=FR_OK) //打开失败 { i=0; while((res!=FR_OK)&(i<100)) { i++; f_close(&fp); f_mount(NULL, DiskPath, 0);; f_mount(&fs1, "0:", 1); res=f_open(&fp,"BC25.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS );//0:/ } if(i>98) { //u5_printf("open BC25.txt fail\r\n"); return FR_NO_PATH ; } } // if(res==FR_OK) //打开成功 // { f_lseek (&fp,f_size(&fp)); f_write(&fp,data_common1.Pack_data,strlen(data_common1.Pack_data),&bws); f_write(&fp,"\r\n",2,&bws); f_close(&fp); // } f_mount(NULL, DiskPath, 0); return FR_OK; } void Write_Test(void) { f_mount(&fs1, "0:", 1); f_open(&fp,"test.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); f_lseek (&fp,f_size(&fp)); f_write(&fp,"Equipment_ID,DateTime,Power-V,Latitude,N/S,Longitude,E/W,Ch1-SoilT_C,Ch1-SoilVWC_%,Ch1-Soil_DS,Ch2-SoilT_C,Ch2-SoilVWC_%,Ch2-Soil_DS,Ch3-SoilT_C,Ch3-SoilVWC_%,Ch3-Soil_DS,Ch4-SoilT_C,Ch4-SoilVWC_%,Ch4-Soil_DS,Ch5-SoilT_C,Ch5-SoilVWC_%,Ch5-Soil_DS,Ch6-SoilT_C,Ch6-SoilVWC_%,Ch6-Soil_DS,qxz-Temperature_C,qxz-Humidity_%RH,qxz-AirPressure_hPa,qxz-WindSpeed_m/s,qxz-WindDirection_°,qxz-Rainfall_mm,qxz-Illuminance_lux,IOT_Cpin,IOT_Csq,IOT_Net,Tf_Tol,Tf_Free\r\n", strlen("Equipment_ID,DateTime,Power-V,Latitude,N/S,Longitude,E/W,Ch1-SoilT_C,Ch1-SoilVWC_%,Ch1-Soil_DS,Ch2-SoilT_C,Ch2-SoilVWC_%,Ch2-Soil_DS,Ch3-SoilT_C,Ch3-SoilVWC_%,Ch3-Soil_DS,Ch4-SoilT_C,Ch4-SoilVWC_%,Ch4-Soil_DS,Ch5-SoilT_C,Ch5-SoilVWC_%,Ch5-Soil_DS,Ch6-SoilT_C,Ch6-SoilVWC_%,Ch6-Soil_DS,qxz-Temperature_C,qxz-Humidity_%RH,qxz-AirPressure_hPa,qxz-WindSpeed_m/s,qxz-WindDirection_°,qxz-Rainfall_mm,qxz-Illuminance_lux,IOT_Cpin,IOT_Csq,IOT_Net,Tf_Tol,Tf_Free\r\n"),&bws); f_write(&fp,data_common1.Pack_data,strlen(data_common1.Pack_data),&bws); f_write(&fp,"\r\n",2,&bws); f_close(&fp); f_mount(NULL, "0:", 1); // free(fs); } /* ********************************************************************************************************* * 函 数 名: Fil_delete() * 功能说明: 删除文件 * 输 入 :文件名 name * 输 出 :无 ********************************************************************************************************* */ FRESULT Fil_delete(char *names) { FRESULT result; char namebuff[10]="\0"; sprintf(namebuff,"%s%s",names,".txt"); f_mount(&fs1, "0:", 1); result = f_unlink(namebuff); f_close(&fp); if(result == FR_OK) { }//u5_printf("delete sucess"); f_mount(NULL, DiskPath, 0);; return result; } /* ********************************************************************************************************* * 函 数 名: txt_size_read() * 功能说明: 读取文件的大小byte * 输 入 :文件名 name * 输 出 :无 ********************************************************************************************************* */ u32 txt_size_read(char *fname) { // u8 i=0; FRESULT res; u32 txt_size; char name[20]; sprintf(name,"%s%s",fname,".txt"); res=f_mount(&fs1, "0:", 1); res=f_open(&fp,"0:/BC25.txt",FA_READ); if(res!=FR_OK) //打开失败 { //u5_printf("open bc25txt size fail\r\n"); return FR_NO_FILE; } txt_size=f_size(&fp); res=f_close(&fp); f_mount(NULL, DiskPath, 0);; return txt_size; } uint16_t Count(char *P) { uint16_t count = 0; while((P[count++] != 0x0a)&&(P[count - 1] != 0x0d) && count < max_transmission+15); return count; } /* ********************************************************************************************************* * 函 数 名: FATFS_Read_TF() * 功能说明: TF卡数据读取 * 输 入 :文件名 name 起始位置 start 数据长度 len * 输 出 :无 ********************************************************************************************************* */ void FATFS_Read_TF(char *fname,u32 start_pos,u32 len) { FRESULT res; u32 tf_sendpos=0; u16 size_buf,Send_Len = 0,Save_Addr = 0; u8 times; u32 i,lens_quotient,len_remainder;//商,余数 char rname[10]; if(BC25_Status.socket==0)return; memset(Tf_Read_Buff,0,sizeof(Tf_Read_Buff)); memset(Send_Buf,0,sizeof(Send_Buf)); memset(Temp_Buf,0,sizeof(Temp_Buf)); EEPROM_ReadDWords(180,&tf_sendpos,1);//读取TF卡开始传输数据的位置 if(tf_sendpos>len)tf_sendpos=0;//防止卡数据手动删除 sprintf(rname,"%s%s",fname,".txt"); lens_quotient=(len-tf_sendpos)/max_transmission; len_remainder=(len-tf_sendpos)%max_transmission; memset(Tf_Read_Buff,0,sizeof(Tf_Read_Buff)); if(osEventFlagsGet(EventFlagID_PROCESS)&EVENT_TFstore_BIT_6) { osDelay(3000); } res=f_mount(&fs1, "0:", 1); res=f_open(&fp,rname,FA_READ); times=0; while((res!=FR_OK)&(times<100)) { res=f_close(&fp); res=f_mount(&fs1, "0:", 1); res=f_open(&fp,rname,FA_READ); } f_lseek(&fp, start_pos+tf_sendpos); for(i=0;i 0x2F) && (Temp_Buf[0] < 0x3A)) // Temp_Buf[0] 在‘0’---‘9’之间 { IOT_Theme_TYPE = IOT_Theme_data; } else { IOT_Theme_TYPE = IOT_Theme_config; } sprintf(Send_Buf,"Pub,%d,%s*",Send_Len+1,Temp_Buf); Send_Len = Count(Send_Buf); times=0; if(IOT_Theme_TYPE != IOT_Theme_config) { if(BC25_Senddata_mode(Send_Len + 2,Send_Buf)) { //u5_printf("bc25 send fail:%ld\r\n",tf_sendpos); return;//发送失败 } } tf_sendpos += Save_Addr;//传输一次,更新一次位置 f_lseek(&fp, start_pos+tf_sendpos); EEPROM_WriteDWords(180,&tf_sendpos,1); } while(tf_sendpos < len) { res=f_read(&fp,Tf_Read_Buff,max_transmission,&bws); Send_Len = Count(Tf_Read_Buff); Save_Addr = Send_Len + 1; memset(Send_Buf,0,sizeof(Send_Buf)); memset(Temp_Buf,0,sizeof(Temp_Buf)); memcpy(Temp_Buf,Tf_Read_Buff,Send_Len + 1); sprintf(Send_Buf,"Pub,%d,%s*",Send_Len+1,Temp_Buf); Send_Len = Count(Send_Buf); if(IOT_Theme_TYPE != IOT_Theme_config) { if(BC25_Senddata_mode(Send_Len + 2,Send_Buf)) { //u5_printf("bc25 send fail:%ld\r\n",tf_sendpos); return;//发送失败 } } tf_sendpos += Save_Addr;//传输一次,更新一次位置 f_lseek(&fp, start_pos+tf_sendpos); EEPROM_WriteDWords(180,&tf_sendpos,1); __nop(); } tf_sendpos=0;//传输完置0 EEPROM_WriteDWords(180,&tf_sendpos,1); res=f_close(&fp); f_mount(&fs1, "0:", 1); Fil_delete("BC25");//删除备份数据 } /* ********************************************************************************************************* * 函 数 名: Common_Data_Pack() * 功能说明: 数据打包 * 输 入 :无 * 输 出 :无 ********************************************************************************************************* */ void Common_Data_Pack(void) { sprintf(data_common1.Time_DATA,"%c%c/%c%c/20%c%c %c%c:%c%c:%c%c", rtc_data[2],rtc_data[3],rtc_data[4],rtc_data[5],rtc_data[0],rtc_data[1], rtc_time[0],rtc_time[1],rtc_time[2],rtc_time[3],rtc_time[4],rtc_time[5]);//日期和时间存储 memset(data_common1.Pack_data,0,sizeof(data_common1.Pack_data)); sprintf(data_common1.Pack_data,"%s,%s,%s%s%s,%s,%s,%s,%s,%s,%s", Init_Data_Equipment.Equipment_ID, data_common1.Time_DATA, data_common1.ADC_DATA, data_common1.GPS_DATA, Sdi_Fram_Record_Structs.Ch1_RX_BUF, Sdi_Fram_Record_Structs.Ch2_RX_BUF, Sdi_Fram_Record_Structs.Ch3_RX_BUF, Sdi_Fram_Record_Structs.Ch4_RX_BUF, Sdi_Fram_Record_Structs.Ch5_RX_BUF, Sdi_Fram_Record_Structs.Ch6_RX_BUF, // Sdi_Fram_Record_Structs.Ch7_RX_BUF, // Sdi_Fram_Record_Structs.Ch8_RX_BUF, // Sdi_Fram_Record_Structs.Ch9_RX_BUF Sdi_Fram_Record_Structs.QXZ_RX_BUF ); sprintf(data_common1.Pack_len,"%d,",strlen(data_common1.Pack_data)+2); //测试部分 if((data_common1.Pack_data[0] < 0x30) || (data_common1.Pack_data[0] > 0x39)) { memset(data_common1.Pack_data,0,sizeof(data_common1.Pack_data)); sprintf(data_common1.Pack_data,"%s\r\n","TESTTEST" // Sdi_Fram_Record_Structs.Ch7_RX_BUF, // Sdi_Fram_Record_Structs.Ch8_RX_BUF, // Sdi_Fram_Record_Structs.Ch9_RX_BUF ); } } //得到磁盘剩余容量 //drv:磁盘编号("0:"/"1:") //total:总容量 (单位KB) //free:剩余容量 (单位KB) //返回值:0,正常.其他,错误代码 uint8_t exf_getfree(char *drv,u32 *total,u32 *frees) { FATFS *fs; fs=malloc(700); FRESULT res; u32 fre_clust=0, fre_sect=0, tot_sect=0; //得到磁盘信息及空闲簇数量 res=f_mount(fs, "0", 1); res =f_getfree("0", (DWORD*)&fre_clust, &fs); if(res==0) { tot_sect=(fs->n_fatent-2)*fs->csize; //得到总扇区数 fre_sect=fre_clust*fs->csize; //得到空闲扇区数 *total=tot_sect>>1; //单位为KB *frees=fre_sect>>1; //单位为KB *total=(*total)/1024; //单位为M *frees=(*frees)/1024; //单位为M } res=f_mount(NULL, "0", 1); free(fs); return res; } /***************************** END OF FILE *********************************/