嵌入式与卫星导航定位上位机软件开发(基于MFC框架)
- 1 串口通信——MSComm 控件
- 2 数据绘图——ChartCtrl
- 3 小结
专业课程要求,在SEED-DEC6713开发板上实现实时的单点定位程序解算,将结果以自定义格式编码通过串口依次输出。
然后,开发一个类似于串口助手的PC上位机软件,用于从串口接收开发板输出的导航定位结果,并完成数据解码和定位结果显示界面。
讲道理,我的嵌入式学得实在是一塌糊涂,界面开发也几乎是从零起步,磨了好几个星期才把上位机软件写出来,踩了无数的坑,因此在这做个总结。
最终效果图如下:
关于上位机软件的开发,我下载了一个别人写好的串口调试助手,在这个基础上进行修改,实现二进制导航定位结果解码,然后开发了实时的动态绘图界面。
总体为在MFC界面开发框架下,利用 MSComm 控件完成串行端口通信编程,基于 ChartCtrl 源代码库实现实时绘图操作。
下载链接:串口调试助手源代码(MFC+SComm)
1 串口通信——MSComm 控件
采用 VS2017 开发平台提供的串行通信编程 ActiveX 控件——MSComm
(Microsoft Communications Control),完成串行端口的数据传输和数据接收。
与中断类似,MSComm 控件通过事件驱动通讯处理串行端口交互。
当在串口接收缓冲区中有字符或字符长度达到设定阈值限度时,可以利用 MSComm 控件的OnComm事件捕获并处理这些通讯事件。
2 数据绘图——ChartCtrl
ChartCtrl 库是一个基于 C++的 MFC 扩展控件,能够用于界面图表绘制。
ChartCtrl 库的基本属性功能包括:绘制折线图、柱状图,设置坐标轴、标题、图例、标注,设置坐标区背景颜色、网格、线型等等。
通过 ChartCtrlInit()函数初始化绘图界面,设定坐标轴数值范围等。
如下,以X 坐标结果变化图为例,界面初始化设定了标题“X 坐标”和绘图背景色 RGB(255,255, 255),即为白色;对于坐标轴 XY 采用 SetAutomatic 模式,根据计算数值自动设定坐标刻度范围。
m_chartctrl.EnableRefresh(true);
m_chartctrlX.GetTitle()->AddString(_T("X 坐标"));//设置标题
m_chartctrlX.SetBackColor(RGB(255, 255, 255));//设置背景色
//设置 XY 坐标轴
pAxis = m_chartctrlX.CreateStandardAxis(CChartCtrl::BottomAxis);
pAxis->SetAutomatic(true);
pAxis = m_chartctrlX.CreateStandardAxis(CChartCtrl::LeftAxis);
pAxis->SetAutomatic(true);
通过 DataShow ()函数实现折线图绘制,代码如下所示:输入数组 xb、yb 即为横纵坐标数据,len 对应绘图点数。
void DataShow(double *xb, double *yb, int len, CChartCtrl* m_chartctrl) {
m_chartctrl->EnableRefresh(false);
CChartLineSerie *pLineSerie;
m_chartctrl->RemoveAllSeries();
pLineSerie = m_chartctrl->CreateLineSerie();
pLineSerie->SetSeriesOrdering(poNoOrdering);//设置为无序
pLineSerie->AddPoints(xb, yb, len);
pLineSerie->SetWidth(3);
UpdateWindow();
m_chartctrl->EnableRefresh(true);
}
3 小结
总体来说,这个上位机软件开发工作量还是挺多的,我一个人写了可能三个星期?主要是太菜,几乎全部从零起步。
最开始试了很多现有的串口调试助手代码,有的版本太老,VS环境也不兼容了,有的功能又过于简单……建议以后还是多学学 C# 或者 Qt 吧,开发界面还是好用些。
关于串口通信操作,我尝试使用了 MSComm 控件,CSerialPort 串口类, Windows API 来进行串口操作,后两者实在是搞不懂,最后还是使用了MSComm 控件,触发机制类似于中断也比较好理解。
关于图表绘制操作,可用的库很多,比如ChartCtrl、TeeChart、Mschart 等等。关于ChartCtrl的教程其实比较少,但是后两者我也没搞明白,还好最后死磕俩星期做完了。
目前我写的这个上位机软件还是存在很多问题:
- 原始的串口调试助手不能自动识别端口号,我去机房连开发板测试,一旦端口号不在可选项里就没辙了,我就只能手动改代码了;
- 定位结果输出和绘图不能保证完全同步,绘图界面获取定位结果是通过定时器固定时间间隔不断刷新,有新数据就进行绘制,我也没想明白怎么实现同步;
- ChartCtrl绘图怎么解决图例位置的问题,我查到有代码使用GetLegend()->UndockLegend(),奇怪的是我用这个函数毫无反应。
- 关于横坐标怎么动态显示GPS周内秒这个问题,到最后也没解决。