?? battery.~cpp
字號(hào):
/*****************************************************************************
* battery.cpp ------ 檢測(cè)電池狀態(tài)并以文本和曲線的方式顯示出來
* 主要功能1:利用spcomm元件獲取串口RS232的數(shù)據(jù)
* (包括;電量、電流、電壓、電量剩余百分比)
* 實(shí)現(xiàn)函數(shù):Comm1ReceiveData
*
* 功能2:對(duì)數(shù)據(jù)進(jìn)行篩選和轉(zhuǎn)換并以文本形式顯示出來
* 實(shí)現(xiàn)函數(shù): ReceiveFlagData(buffer); //獲取充電狀態(tài)
* ReceiveCapaData(buffer); //獲取電量數(shù)據(jù)
* ReceiveChargeData(buffer); //獲取電流數(shù)據(jù)
* ReceiveVoltData(buffer); //獲取電壓數(shù)據(jù)
* ReceivePercentData(buffer); //獲取剩余電量百分比
*
* 功能3:利用TeeChart元件根據(jù)所得最終數(shù)據(jù)繪制曲線
******************************************************************************/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "battery.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SPComm"
#pragma link "TeeTools"
#pragma link "TeeEdit"
#pragma link "TeeChartGrid"
#pragma link "TeeNavigator"
#pragma link "TeeURL"
#pragma link "TeeBannerTool"
#pragma link "EVENTLISTLib_OCX"
#pragma resource "*.dfm"
TMainForm *MainForm;
//--------------------構(gòu)造函數(shù),初始化變量------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
bFlashflag = false; //判斷是否閃爍窗體
bLinkflag = false; //判斷是否連接
BatFullFlag = false; //判斷電池是否已滿
RemCapacity= 0; //剩余電量值
Current=0; //電流
Voltage=0; //電壓
Power=0; //功耗
iInterval=0; //數(shù)據(jù)顯示超時(shí)時(shí)間 (s)
tStartTime=0; //連接后計(jì)時(shí)時(shí)間
}
//-----------------------創(chuàng)建表單,初始化控件-----------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
//清空曲線點(diǎn)
RamCapicitySeries->Clear();
VoltageSeries->Clear();
ChargeCurrentSeries->Clear();
}
//-----------------------關(guān)閉表單,釋放資源------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
Comm1->StopComm();
//AnimateWindow(this->Handle,1500,AW_CENTER | AW_HIDE);
}
/*************************************************************************************\
************************[ 主要功能實(shí)現(xiàn)函數(shù) ]**********************************
\*************************************************************************************/
//------------------------連接或斷開串口------------------------------
void __fastcall TMainForm::BtnLinkClick(TObject *Sender)
{
if(!bLinkflag) //-----連接-----
{
BtnLink->Caption="斷開";
tStartTime=Time();
iInterval=0;
//獲取波特率和COM口
Comm1->BaudRate=RateComboBox->Text.ToInt();
Comm1->CommName=ComComboBox->Text;
Comm1->StartComm(); //打開串口
Memo1->Lines->Add("已經(jīng)連接:Com="+ ComComboBox->Text +" Rate="+RateComboBox->Text);
}
else //-----斷開-------
{
BtnLink->Caption="連接";
Edit1->Clear();
TextTool->Text="0:00:00";
ScrollTool->Text="";
Comm1->StopComm(); //關(guān)閉串口
Memo1->Lines->Add("已經(jīng)斷開");
}
//控件可用/不可用的轉(zhuǎn)換
bLinkflag = !bLinkflag;
Timer1->Enabled = !(Timer1->Enabled);
BtnWrite->Enabled = !(BtnWrite->Enabled);
Edit1->Enabled = !(Edit1->Enabled);
ComComboBox->Enabled = !(ComComboBox->Enabled);
RateComboBox->Enabled = !(RateComboBox->Enabled);
MaskEdit1->Enabled = !(MaskEdit1->Enabled);
}
//-----------------------寫入數(shù)據(jù)到串口--------------------------------
void __fastcall TMainForm::BtnWriteClick(TObject *Sender)
{
AnsiString str;
str = Edit1->Text;
if(str.IsEmpty())
return;
Memo1->Lines->Add("Write: "+str);
Comm1->WriteCommData( str.c_str(),str.Length());
}
//------------ spcomm 接收到數(shù)據(jù)后執(zhí)行以下事件 ----------------------
void __fastcall TMainForm::Comm1ReceiveData(TObject *Sender, Pointer Buffer,
WORD BufferLength)
{
AnsiString buffer, bufferCap, bufferCurrent, bufferVolt, bufferPercent;
//-----保存數(shù)據(jù)
buffer = (char*)Buffer;
if(buffer.Pos("IICisReady"))
{
//-----------------------------------------------------------
// Power = Current * Voltage ; //功耗
//分別顯示出: 當(dāng)前時(shí)間--電量值---電流值---電壓值---剩余電量百分比
// if(iInterval >= MaskEdit1->Text.ToInt())
// {
//將數(shù)據(jù)傳遞給各個(gè)函數(shù),分別進(jìn)行篩選和轉(zhuǎn)換,并返回所需數(shù)據(jù)
ReceiveFlagData(buffer); //獲取充電狀態(tài)
bufferCap = ReceiveCapaData(buffer); //獲取電量數(shù)據(jù)
bufferCurrent = ReceiveChargeData(buffer); //獲取電流數(shù)據(jù)
bufferVolt = ReceiveVoltData(buffer); //獲取電壓數(shù)據(jù)
bufferPercent = ReceivePercentData(buffer); //獲取剩余電量百分比
#if 0
if(bufferCap=="error" || bufferCurrent=="error" || bufferVolt=="error" ||
bufferPercent=="error" ) //為空表示有錯(cuò)誤
return;
#endif
Memo1->Lines->Add(TimeToStr(Time())+ bufferCap + bufferCurrent + bufferVolt +bufferPercent);
//繪制曲線點(diǎn)
RamCapicitySeries->Add(RemCapacity,TimeToStr(Time()) ,clRed);
VoltageSeries->Add(Voltage,TimeToStr(Time()) ,clRed);
ChargeCurrentSeries->Add(Current,TimeToStr(Time()) ,clRed);
iInterval=0;
// }
}
else
{
Memo1->Lines->Add(buffer);
}
}
//-----------------------獲取充電狀態(tài)并輸出--------------------
//-------------------------------------------------------------
//字符串處理流程:查找->截取->排序->轉(zhuǎn)換->錯(cuò)誤判斷(防止亂碼)
//-------------------------------------------------------------
void _fastcall TMainForm::ReceiveFlagData(AnsiString buffer)
{
AnsiString myBuf(buffer),tempBuf,tempHexBuf;
int iPos=0;
int iTemp=0;
if( (iPos = myBuf.Pos("BQ272_FLAGS")) !=0 )
{
ScrollTool->Text="正在充電";
myBuf = myBuf.SubString(iPos,15);
//----------防止亂碼---------------
if(myBuf.Length()<15)
return;
//重新給16進(jìn)制字符串排序
tempBuf.sprintf("%c%c",myBuf[13],myBuf[14]);
//將16進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制整數(shù)
iTemp=(int)strtol(tempBuf.c_str(),NULL,16);
if(iTemp>=160 && iTemp<192)
{
Memo1->Lines->Add(TimeToStr(Time())+" 電池已滿 "+tempBuf);
//BatFullFlag = true;
}
}
else if((myBuf.Pos("BQ27200_Discharge_Flags"))!=0)
{
ScrollTool->Text="正在放電";
}
else
return ;
}
//-----------------------獲取電量---------------------------
AnsiString _fastcall TMainForm::ReceiveCapaData(AnsiString buffer)
{
AnsiString myBuf(buffer),tempBuf,tempHexBuf;
int iPos=0, iTemp=0;
if((iPos = myBuf.Pos("RemCapacity"))!=0)
myBuf = myBuf.SubString(iPos,18);
else
return "error";
//%%%%%%%%%%%%%%%%%%%%%防止亂碼%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(myBuf.Length()<18)
return "error";
for(int i=13; i<=17; i++)
{
if(i==15)
continue;
if(!(( myBuf[i]>='0' && myBuf[i]<='9' ) || ( myBuf[i]>='A' && myBuf[i]<='F' )) )
return "error";
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//重新給16進(jìn)制字符串排序
tempBuf.sprintf("%c%c%c%c",myBuf[16],myBuf[17],myBuf[13],myBuf[14]);
tempHexBuf=tempBuf;
//將16進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制字符串
iTemp=(int)strtol(tempBuf.c_str(),NULL,16);
//RemCapacity = (double)iTemp*3.57/20;
RemCapacity=iTemp;
tempBuf.sprintf("%15d",iTemp);
//test for error
if(RemCapacity > 8500)
return "error";
// tempBuf+=tempHexBuf;
return tempBuf;
}
//-----------------------獲取電流---------------------------
AnsiString _fastcall TMainForm::ReceiveChargeData(AnsiString buffer)
{
AnsiString myBuf(buffer),tempBuf,tempHexBuf;
int iPos=0;
int iTemp=0;
/*********************檢測(cè)充電電流***********************/
if( (iPos=myBuf.Pos("ChargeCurrent")) !=0 )
{
myBuf = myBuf.SubString(iPos,19 );
//-%%%%%%%%%%%%%%%%%%%%%%%%防止亂碼-%%%%%%%%%%%%%%%%%%%%%%%%%---
if(myBuf.Length()<19)
return "error";
for(int i=15; i<=19; i++)
{
if(i==17)
continue;
if(!(( myBuf[i]>='0' && myBuf[i]<='9' ) || ( myBuf[i]>='A' && myBuf[i]<='F' )))
return "error";
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//重新給16進(jìn)制字符串排序
tempBuf.sprintf("%c%c%c%c",myBuf[18],myBuf[19],myBuf[15],myBuf[16]);
tempHexBuf=tempBuf;
//將16進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制字符串
iTemp=(int)strtol(tempBuf.c_str(),NULL,16);
// tempBuf.sprintf("%15.2f",iTemp*3.57/20) ;
tempBuf.sprintf("%15d",iTemp);
Current = (double)iTemp;
//Current = (double)iTemp*3.57/20;
}
/***********檢測(cè)放電電流*******************/
else if( (iPos = myBuf.Pos("DischargeCurrent")) !=0)
{
myBuf = myBuf.SubString(iPos,23);//ym
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%防止亂碼%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(myBuf.Length()<23)
return "error";
for(int i=18; i<=22; i++)
{
if(i==20)
continue;
if(!(( myBuf[i]>='0' && myBuf[i]<='9' ) || ( myBuf[i]>='A' && myBuf[i]<='F' )))
return "error";
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//重新給16進(jìn)制字符串排序
tempBuf.sprintf("%c%c%c%c",myBuf[21],myBuf[22],myBuf[18],myBuf[19]);
tempHexBuf=tempBuf;
//將16進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制字符串
iTemp=(int)strtol(tempBuf.c_str(),NULL,16);
// tempBuf.sprintf("%15.2f",iTemp*3.57/20) ;
// Current = (double)iTemp*3.57/20;
tempBuf.sprintf("%15d",iTemp) ;
Current = (double)iTemp;
if(Current > 8500)
return "error";
}
return tempBuf;
}
//-----------------------獲取電壓-------------------------------------
AnsiString _fastcall TMainForm::ReceiveVoltData(AnsiString buffer)
{
AnsiString myBuf(buffer),tempBuf,tempHexBuf;
int iPos=0;
int iTemp=0;
if((iPos = myBuf.Pos("PreVOLT")) !=0)
myBuf = myBuf.SubString(iPos,14);
else
return "error";
//%%%%%%%%%%%%%%%%%%%%%%%%%防止亂碼---%%%%%%%%%%%%%%%%%%%%%%%%%%%------
if(myBuf.Length()<14)
return "error";
for(int i=9; i<=13; i++)
{
if(i==11)
continue;
if(!(( myBuf[i]>='0' && myBuf[i]<='9' ) || ( myBuf[i]>='A' && myBuf[i]<='F' )))
return "error";
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//重新給16進(jìn)制字符串排序
tempBuf.sprintf("%c%c%c%c",myBuf[12],myBuf[13],myBuf[9],myBuf[10]);
tempHexBuf=tempBuf;
//將16進(jìn)制字符串轉(zhuǎn)換為10進(jìn)制字符串
iTemp=(int)strtol(tempBuf.c_str(),NULL,16);
Voltage = iTemp;
tempBuf.sprintf("%15d",iTemp);
//test for error
// if(Voltage > 6000)
if(Voltage > 8500)
return "error";
//tempBuf+=tempHexBuf;
return tempBuf;
}
//-----------------------獲取電量百分比---------------------------
AnsiString _fastcall TMainForm::ReceivePercentData(AnsiString buffer)
{
AnsiString myBuf(buffer),tempBuf,tempHexBuf;
int iPos=0;
int iTemp=0;
if((iPos = myBuf.Pos("RSOC")) != 0)
myBuf = myBuf.SubString(iPos,8);
else
return "error";
//---%%%%%%%%%%%%%%%%防止亂碼-----%%%%%%%%%%%%%%%%%%----
if(myBuf.Length()<8)
return "error";
for(int i=6; i<=7; i++)
{
if(!(( myBuf[i]>='0' && myBuf[i]<='9' ) || ( myBuf[i]>='A' && myBuf[i]<='F' )))
return "error";
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//重新給16進(jìn)制字符串排序
tempBuf.sprintf("%c%c",myBuf[6],myBuf[7] );
tempHexBuf=tempBuf;
iTemp=(int)strtol(tempBuf.c_str(),NULL,16);
tempBuf.sprintf("%15d%%",iTemp);
//----------防止亂碼---------
if(iTemp > 100 || iTemp <= 0)
return "error";
//tempBuf+=tempHexBuf;
return tempBuf;
}
/*---------------------------------------------------------------------------
-------------------------> 次要功能實(shí)現(xiàn)函數(shù) <------------------------------
----------------------------------------------------------------------------*/
//--------------添加計(jì)時(shí)顯示功能-----------------------
void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
TextTool->Text=TimeToStr(Time()-tStartTime);
iInterval++;
}
//--------------------曲線全屏顯示------------------------------------
void __fastcall TMainForm::BtnFullScrClick(TObject *Sender)
{
FullScreenTool->Active = true;
}
//------------------將曲線打印------------------------------------
void __fastcall TMainForm::BtnPreViewClick(TObject *Sender)
{
ChartPreviewer1->Execute();
}
//----------------將曲線導(dǎo)出--------------------------------------
void __fastcall TMainForm::BtnExportClick(TObject *Sender)
{
ChartEditor1->Title="圖表導(dǎo)出";
ChartEditor1->HighLightTabs=true;
ChartEditor1->DefaultTab=cetExport;
ChartEditor1->Execute();
}
void __fastcall TMainForm::BtnFlashClick(TObject *Sender)
{
if(!bFlashflag)
{
BtnFlash->Caption = "不閃* * !" ;
FLASHWINFO fwi;
fwi.cbSize = sizeof(fwi);
fwi.hwnd = Application->Handle;
fwi.dwFlags = FLASHW_TRAY | FLASHW_TIMER ;
// fwi.uCount = 5;
fwi.dwTimeout = 500;
FlashWindowEx(&fwi);
}
else
{
BtnFlash->Caption = "閃爍^ ^" ;
FLASHWINFO fwi;
fwi.cbSize = sizeof(fwi);
fwi.hwnd = Application->Handle;
fwi.dwFlags = FLASHW_STOP ;
//fwi.uCount = 5;
fwi.dwTimeout = 500;
FlashWindowEx(&fwi);
}
bFlashflag = !bFlashflag;
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -