一、前言
- 剛步入社會工作,只是想把自己做的事情做一個記錄,同時也可以分享給網友,雖然都是些基礎,但領導說得很對,細節非常重要;
- 本測試程序非常簡單,對本人來說,意義在於讀取電池放電的採樣數據,然後把得到的離散數據用excel繪製成一條放電曲線,找到電池滿電以及空點的臨界點,最後應用到應用層的電池充放電的圖標繪製;
二、代碼說明
1. 打開要保存文件的方式
linux環境支持的文件打開的幾種方式,可以用man fopen進行查看,如下:
跟我在以前譚浩強C語言課本中看到的有點不一樣,還有b選項,我採用的是“a+”模式,當文件關閉後,可以繼續追加寫;
fp = fopen("/usr/value_ad.txt","a+");
2. 整數轉換字符串再存取
開始準備fwrite()進行寫操作的,後來發現還是把整數轉換成字符串存入文件更方便,經查閱資料發現,非linux環境下的整數轉換字符串除了支持 sprintf()函數外,還支持itoa()函數,在此針對linux環境就只採用sprintf()函數;
通過fputs()函數進行寫,需添加頭文件#include
sprintf(str,"%d",data);
fputs(str,fp);
3. linux環境與windows環境的換行格式的差別
在每次寫一個字符竄數據之後,都要寫一個換行符,如果採用如下代碼:
fputs("\n",fp);
在linux打開保存的文件如下:
但在windows下面打開該文件的數據排版如下:
解決該問題的方法如下:
利用“\r\n”替換“\n”,即
fputs("\r\n",fp);
源碼及測試
以下源碼爲我單獨編寫的,思路都是一樣,數據來源不一樣而已;
#include <stdio.h>
#include <stdlib.h>
#define READ_DATA_COUNT 20
#define OPEN_FILE_COUNT 5
int main(int argc,char **argv){
int data = 222;//模擬讀取的數據
int count = 0;//記錄所讀取數據的次數,再進行存取操作
int saveData_perOpen = 0;//每次打開設備文件所要所存數據的數量
char str[25];
FILE *fp;
if((fp = fopen("/usr/value_ad.txt","a+")) == NULL)//打開設備文件
{
printf("cannot open this file\n");
return 0;
}
//如果自己測試就把while(1)改成有限循環來執行;
while(1){//因爲要測試電池的AD值,並不知道循環具體的終止條件,那麼就讓嵌入式設備自動關機來結束
data++;
count++;
if(count%READ_DATA_COUNT == 0){//因爲採樣的數據頻率快,我選擇每讀取20個數據存一次
printf("%d\n", data);
sprintf(str,"%d",data);//整數轉換字符串
if(fputs(str,fp) == '\0')//寫字符串
{
printf("cannot open file\n");
return 0;
}
fputs("\r\n",fp);//寫換行符
count = 0;
saveData_perOpen++;
if (saveData_perOpen == OPEN_FILE_COUNT)//如果不採用這個if,估計設備關機是不會執行fclose()函數的(我直接用ctrl+c終止後臺測試的),數據就不能保存成功,所以採用一種比較笨的方法,每存5個數時關閉文件再打開,還可以fflush()函數刷新;
{
fclose(fp);//關閉設備文件
if((fp = fopen("/usr/value_ad.txt","a+")) == NULL)//重新打開設備文件
{
printf("cannot open this file\n");
return 0;
}
saveData_perOpen = 0;
}
}
}
fclose(fp);//關閉設備文件
return 0;
}
在採集的2萬多個數據中,存取了1500個左右的數據,然後用所得的數據繪製成一張電池的放電曲線,如下圖:
開始的數據可能是接了外接電源的緣故,AD值會大一些,但不會影響整個曲線趨勢的大體走向。