MFC串口编程
1.先记录一个调试中遇到的问题:
在串口的接受方法中采用COleSafeArray类对VARIANT类型进行变换,编译正常,运行串口测试程序后,每当串口接受到数据,程序便出现如下错误:Debug Assertion Failed!
Program:..........
File: olevar.cpp
Line:2553
.............
这个小问题搞了半天的时间,开始把问题定位在了COleSafeArray类的使用方法上,但是查阅资料证明用法没有问题。最后把串口的输入方式设置为二进制解决了问题。
代码如下:
void CComUpdateDlg::OnOnCommMscomm()
{
VARIANT ComRcv;
COleSafeArray ComRcvArray;
BYTE RcvBuf[1024];
long len,k;
if(m_ctrlComm.GetCommEvent()==2)
{
ComRcv = m_ctrlComm.GetInput();
ComRcvArray=ComRcv; //VARIANT型变量转换为ColeSafeArray型变量
len=ComRcvArray.GetOneDimSize(); //验证得到有效数据长度
for(k=0;k<len;k++)//len is 5 in normal case
ComRcvArray.GetElement(&k,RcvBuf+k);//转换为BYTE型数组
HandleCommand(RcvBuf);
}
}
2.展示一下我自学做的MFC程序的界面:
所做的程序能够通过上位机对NXP LPC1766、LPC1768(LPC17XX)的cortex M3处理器进行程序或固件的升级。
升级程序包括两部分:
上位机部分用MFC实现,通过串口或者网口与板子进行交互并实现固件升级。
板子中的bootloader部分能够通过IAP方式将上位机发送过来的程序数据保存到处理器的片上flash中,并在升级完成后跳转到烧写后的固件地址运行程序。
升级原理比较简单,但是全部弄痛了还是需要花费一定的时间和经历的!
界面如下:
3.文件路径转换为C语言中的字符串
在MFC编程中经常需要操作文件,常用的做法是通过一个button选择文件的路径,之后把文件的路径获取到一个CString变量中。但有的时候,我们习惯于通过fopen等函数操作文件,这时就要把文件路径由CString类型转换为char *类型。但是由于路径中存在‘\’,对于char *来说,‘\’为转义字符,因此路径“E:\doc\test.data”转为char *应该为“E:\\doc\\test.data”才能够被fopen等函数正常操作。
此时,可通过如下方法进行类型转换:
char file[256] = {0};
setlocale(LC_ALL, "chs");
wcstombs( file, m_sourcePath, 256 );
其中,CString m_sourcePath为文件的路径。
4.选择文件的路径
代码如下所示:
void CpaydevDlg::OnBnClickedOpenButton()
{
// TODO: 在此添加控件通知处理程序代码
CString strFilter;
strFilter="All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_EXPLORER|OFN_HIDEREADONLY|
OFN_ENABLESIZING|OFN_FILEMUSTEXIST,strFilter);
dlg.m_ofn.lStructSize = sizeof(OPENFILENAME);
if(dlg.DoModal() == IDOK )
{
m_sourcePath=dlg.GetPathName();
}
UpdateData(FALSE);
}
5.串口编程
采用MSComm控件实现。具体大家可以百度了,帖子很多。
最简单的方式是,在程序设计窗口上单击右键,然后选择“Insert ActiveX Control”,弹出如下所示的对话框,选择图示项目即可:
还有一种方式是,在工程中点菜单“Project”->“Add To Porject”->“Components and controls”,然后选择“Microsoft Communications Control, version 6.0.lnk”并单击插入。但是在win10系统中,提示“Microsoft Communications Control, version 6.0 灾难性故障”,而用第一种方法的时候,可以正常插入MSComm控件。