return0; } 1.4 关闭串口 串行接口以文件的形式打开,还需要以文件的形式 将其关闭 利用API函数关闭串口时,只需使用Create- File函数返回的句柄作为参数调用CloseHandle即可: CloseHandle(m_hComm); 以上步骤完成后,还需在主对话框中调用CComm- Port类成员函数,完成串行通信任务 需在主对话框中定 义全局变量m_CommPort作为新建通信类CCommPort的 对象,然后添加串口通信自定义的消息响应函数 0nComm()来完成对串口接收到的数据处理的任务 2 数据写入EXCEL 由于系统需要保存实时接收到的数据,因而可在VC 中调用 EXCEL,将串口接收到的数据存储到 Excel文 件中 (1)打开Excel,将数据导入Excel表中 为了能够调用 Excel 的接口,具体步骤如下:打开 MFCClassWizard 窗 口,选择Automation->AddClass->Fromatypelibrary,进 入 Excel 的类型库 选取 C:\ProgramFiles\MicrosoftOf- fice\office\Excel9.OLB,再根据Excel对象的需要,选择所 需C++驱动程序类 本例选择_Application Workbooks _Workbook Sheets _Worksheet Range,加入新类 所选的 新类以及头文件Excel9.h和源文件Excel9.cpp一并加入 工程 另外,在TemperControlDlg.cpp文件的头部需要添 加头文件#include"excel9.h" 又因为 Excel本身也是一 个实现自动化的COM组件,需初始化COM库,找到App 类的InitInstance()函数,在其中添加AfxOleInit()函数的调 用,初始化COM库代码如下: if(!AfxOleInit())//初始化COM库 { AfxMessageBox(" 初始化COM失败") returnFALSE; } 创建Excel模板的步骤如下:第一,创建作为模板的 一个工作簿 第二,单击" 文件" 菜单中的" 另存为",并 为该文件命名,本例使用 "temp" 作为文件名称;在 " 保 存类型" 框中,选择" 模板"(*.xlt)的类型文件 第三, 击" 保存" 按钮,完成Excel模板创建 (2)打开对话框资源,插入一个按钮, caption为" 数据 导入",添加响应函数,关键程序代码如下: voidCTemperControlDlg::OnBtnDataImport() {_Applicationm_ExlApp; _Workbookbook; _Worksheetsheet; Workbooksbooks; Worksheetssheets; Rangerange; COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); m_ExlApp.CreateDispatch("Excel.Application");//创建 一个Excel应用 m_ExlApp.SetVisible(TRUE);//设置Excel为可见 books=m_ExlApp.GetWorkbooks(); sheets=books.Add(COleVariant("c:\\temp.xlt"));// 用模 板文件建立新文档 book.AttachDispatch(m_ExlApp.GetApplication()); sheets=book.GetSheets();//得到sheets sheet=sheets.GetItem(COleVariant((short)1));// 得到 sheetl sheet.Activate();//激活sheetl range=sheet.GetRange(COleVariant(A1), COleVariant (A1)); //设置表格内容 range.BorderAround(COleVariant((short)1),(long)2,(long) 1,covOptional); range.SetValue(COleVariant(" 时间")); range.SetHorizontalAlignment(COleVariant((short)3));// 设置水平对齐 range.SetVerticalAlignment(COleVariant((short)2));// 设 置垂直对齐 range.SetColumnWidth(COleVariant((short)15)); range=sheet.GetRange(COleVariant("B1"),COleVariant ("G1"));//选定范围 range.Merge(COleVariant((short)1));//合并单元格 range.BorderAround(COleVariant((short)1),(long)2,(long) 1,covOptional); range.SetValue(COleVariant(" 温度显示值")); range.SetHorizontalAlignment(COleVariant((short)3)); range.SetVerticalAlignment(COleVariant((short)2)); range.SetColumnWidth(COleVariant((short)10)); { COleSafeArraysaRet; DWORDnumElements[]={1,7}; saRet.Create(VT_VARIANT,2,numElements); FillSafeArray("接收时间",0,0,&saRet); FillSafeArray("柜内温度1",0,1,&saRet); FillSafeArray("柜内温度2",0,2,&saRet); FillSafeArray("室内温度1",0,3,&saRet); FillSafeArray("室内温度2",0,4,&saRet); FillSafeArray("室外温度",0,5,&saRet); FillSafeArray("监控加热器",0,6,&saRet); range=sheet.GetRange(COleVariant("A1"),COleVariant ("G1")); range.SetValue(COleVariant(saRet)); saRet.Detach(); } //利用 FillSafeArray函数可将串口接收到的实 时数据保存到Excel表中 SaveRealTimeData(&saRet); //释放对象 |