郑光熙
(岭南师范学院 信息与教育技术中心,广东湛江524048)
PC上位机电池数据统计系统
郑光熙
(岭南师范学院 信息与教育技术中心,广东湛江524048)
摘要:针对基于串口一类检测仪器,用VC开发工具实现了对电池检测数据的采集和处理、对串口控制、LED显示模块和图形化显示模块等功能,通过截图和生成绘制图表,实现了对数据检测和控制的图形化和智能化,该软件具有良好的用户体验和实用价值.
关键词:上位机;电池容量;双缓冲;串口通信
独立电力系统及移动的电子设备中应用大量的充电电池(包括锂离子,聚合物锂离子,镍氢,铅酸电池等)为设备提供动力,设备的循环及安全地正常使用依靠充电电池保障,所以对电池的质量监控(包括电池的容量、电压、能量、电导)是保障设备的安全使用的重要手段.价格上万的专业电池检测设备昂贵,难以普及,而基于单片机控制的电池容量检测装置可以降低成本的同时拥有较高的精度,对为大众提供廉价的检测仪有积极意义,可以应用在手机电池,电动车电池航模,四驱车等或其它电池容量检测应用场合.针对这个状况,使用VC编写的串口通信程序则为这种廉价的检测仪如虎添翼,操作简单,一目了然.
上位机是指可以直接发出操控命令的计算机,单片机系统采集的数据反馈给上位机处理,PC屏幕上显示各种信号变化(如液压,水位,温度等),达到各种控制目的,上位机系统可以使用不同的计算机语言来实现,上位机作为建立在性能强大的计算机平台上的软件工具,实现了下位机难以实现的一些智能化管理控制的功能.
系统主要分为8大功能模块:串口通信模块,接收并处理单片机发送过来的数据;绘制电压电流曲线模块,根据电压电流大小绘制动态实时曲线;绘制LED数码管模块,以数码管的形式显示电压和电流的大小;绘制电池电压百分比模块,根据当前电压大小绘制比例;截图模块,手动或者自动全屏、电表截图;托盘功能模块,使得系统在后台运行;文本写入模块,保存数据到Txt文本;自动关机设置模块,电池测试完毕后自动关机、注销或者重启.系统框架见图1.
图1 系统整体设计框架
2.1串口通信模块的实现
2.1.1自动注册MSCOMM32.OCX控件及搜索串口
系统首次运行时需要注册MSCOMM32.OCX控件,需把MSCOMM32.OCX控件文件放置于程序同目录下,程序会把MSCOMM32.OCX控件复制到C盘保存并且进行注册.
程序实现了程序运行时就自动搜索计算机中已经存在的通讯端口号,并把它们显示在组合框控件中.这样避免了用户输入错误或者不存在的端口号.
实现原理:Windows的通讯端口号码存放在注册表中,搜索注册表HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm,查找出当前计算机中存在的通讯端口号码.实现如下:清空组合框打开注册表HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm的位置枚举串口号码存在此串口则把串口插入到组合框中.
2.1.2接收数据函数OnOnComm()
添加OnOnComm()成功后,在数据接收函数OnOnComm()中实现代码如下:
void CTextDlg::OnOnComm()
{VARIANT variant_tmp;//建立转换数据类型用到的变量
CString str="";
if(m_mscomm.GetCommEvent()==2)//数据缓冲区内有数据
{variant_tmp=m_mscomm.GetInput();//读缓冲区
str=variant_tmp.bstrVal;//variant_tmp转换成CString
m_csLowInfo.push(str);//放入STL队列
}}
其中m_csLowInfo是队列变量,访问属性是Public,当串口打开,该函数每隔一段时间就被执行一次,从单片机发送来的数据都插入到队列m_csLowInfo中.
2.2 绘制电压电流曲线模块的实现
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,采用双缓冲技术来绘图.
双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度.基于CStatic的CoordinateSystem类双缓冲实现过程如下:在内存中创建与画布一致的缓冲区;在缓冲区画图;将缓冲区位图拷贝到当前画布上;释放内存缓冲区.在实现电压电流曲线模块之中,最重要的是3个函数,分别是:
DrawXTimeCoord(CDC*pDC);//绘制X坐标上的时间轴
图2 绘图区域的命名
DrawYLeft(CDC*pDC);//绘制电压轴
DrawYRight(CDC*pDC);//绘制电流轴
DrawMiddle(CDC*pDC);//绘制中间部分
各部分命名见图2.因为在每个网格代表的电压或者电流大小不变时,之前计算出来的所有电压和电流的(x,y)坐标都不会改变,再一次计算的结果也还是一样.于是使用了另外两个vector容器保存这些已经计算好的(x,y)坐标,下一次绘图时,直接从这两个容器中取出(x,y)的坐标,直接绘制,直到网格代表的电压或者电流大小发生了变化,再重新进行计算,重新更新已经计算好(x,y)坐标的容器.
各部分命名见图2.因为在每个网格代表的电压或者电流大小不变时,之前计算出来的所有电压和电流的(x,y)坐标都不会改变,再一次计算的结果也还是一样.于是使用了另外两个vector容器保存这些已经计算好的(x,y)坐标,下一次绘图时,直接从这两个容器中取出(x,y)的坐标,直接绘制,直到网格代表的电压或者电流大小发生了变化,再重新进行计算,重新更新已经计算好(x,y)坐标的容器.
在绘图设置面板中,可以设置电压曲线和电流曲线的线条大小、线条颜色,是否显示电池统计信息,是否同时绘制电压和电流曲线.正是因为为CoordinateSystem类编写了如此多的方法,才方便了对曲线各种属性的控制,见图3.
2.3绘制LED数码管模块的实现
基于CStatic的Digitron类实现LED模块,见图4.其中Digitron类的方法设计:
public:
void SetNum(CString cs_num);
void StartShow();
void EndShow();
protected:
VoidDrawDigitron(CDC*pDC);
bool IsNum(CString str);.
2.4绘制电池电压百分比模块的实现
添加一个基于CStatic的Battery类,其中Battery类的方法设计:
public:
void SetPercent(float ref);//设置电池百分比的大小(0到1)
void SetVData(float ref);//根据电压大小设置百分比
protected:
void DrawBattery(CDC*pDC);//绘制电池百分比
图3 绘图设置面板
图4 LED模块
2.5截图原理
把需要截图的区域看作一张静态的背景图片,根据这张背景图片填写BMP文件的文件头、位图信息头、颜色信息和图形数据,就可以保存成一张图片了.截图的关键代码如下:
CDC*pdc=GetDC();
this->GetClientRect(&rect);//获得客户区的区域
CBitmap bm;//定义位图对象
bm.CreateCompatibleBitmap(pdc,width,high);//创建兼容位图
CDC memdc;//定义一个内存画布
memdc.CreateCompatibleDC(pdc);//创建一个兼容的画布
memdc.SelectObject(&bm);//选中位图对象
memdc.StretchBlt(0,0,width,high,pdc,x,y,width,high,SRCCOPY);
BITMAP btm;//定义位图信息
bm.GetBitmap(&btm);//获取位图信息
DWORD size=btm.bmWidthBytes*btm.bmHeight;//计算图像大小
LPSTR lpData=(LPSTR)::GlobalAlloc(GPTR,size);//定义位图信息对象
2.6 文本写入模块的实现
文本写入模块是指把测试电池过程中得到的电压、电流大小以及其他一些电池的信息写入到Txt文本中保存起来,方便日后查看.
如果得到一个数据就写入一个数据,这样会造成长时间占用IO资源.所以文本写入设定在测试完毕,关闭串口之时进行的,没有数据,不写入.主要代码如下;
CreateDirectory(m_csPath_temp_1,NULL);//新建文件夹
CFile*pFile;
pFile=new CFile(temp,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
从Vector向量中提取需要的数据格式化好保存于m_csPath_temp_1变量
pFile->Write(m_csPath_temp_1,strlen(m_csPath_temp_1));//写入
pFile->Close();//关闭文件句柄
握手成功后,单片机会实时检测并发送电池的电压和电流的大小,本软件的数码管开始亮起,并实时显示电压和电流的大小,电池电压百分比也开始绘制(见图5).
图5 连机界面
当发送终止电压,当电池低于或等于该终止电压时,充电或者放电就会停止;当发送放电电流,只有在放电时,此操作才有有效,指定了单片机会以多大的电流进行放电,放电电流越大,测试过程越快结束;在绘图设置面板,可以设置电压或者电流曲线的大小和颜色,也可以只绘制电压或者只绘制电流曲线,当然也可以取消统计信息的显示;填写电池型号和电池上标注的容量,可以在绘图区域显示出来.系统运行见图6.
图6 PC控制软件下的飞毛腿电池检测
本文对电池容量统计系统的设计与实现进行了全面的阐述,从开发背景到功能分析,再从选择相关技术到电池容量统计系统的具体实现都作了比较详尽的介绍,以及展现了这个系统的设计和实现思路.配合通用的串口控制器,可实现对电池监控的界面化和直观化,可以应用在串口通信数据处理显示的各种场合,具有一定的应用价值.
参考文献:
[1]求是科技.单片机通信技术[M].北京:人民邮电出版社,2005.
[2]谭浩强.C程序设计[M].3版.北京:清华大学出版社,2005.
[3]孙皓.Visual C++范例大全[M].北京:机械工业出版社,2009.
[4]陆宗骐.C/C++图像处理编程[M].北京:清华大学出版社,2005.
[5]刘蕾.21天学通C++[M].北京:电子工业出版社,2014.
(责任编辑:欧恺)
中图分类号:TP274
文献标识码:A
文章编号:1007-5348(2015)06-0014-05
[收稿日期]2014-04-13
[作者简介]郑光熙(1986-),男,广东湛江人,岭南师范学院信息与教育技术中心助理实验师,硕士研究生;研究方向:嵌入式系统研究.
PC Battery Data Statistics System
ZHENG Guang-xi
(Information&Educational Technology Center,Lingnan Normal University,Zhangjiang 524048,Guangdong,China)
Abstract:For a serial-based testing instruments,VC development tools for battery testing data collection and processing,serial control,LED display module and graphic display module and other functions,through screenshots and generate charting,achieve the data detection and control of graphs and intelligence,which has a good user experience and practical value.
Key words:battery capacity;double buffer;a serial port communication