做自己的串口调试工具-MFC
之前一共说了几个软件库,串口通讯的,xml加载的,还有动态提示的,通过这三个库就可以实现一个自己的串口调试工具,成品如下

动态加载配置文件之后如下

软件可以在xml中配置发送的字符串,不算是大工程,但是灵活使用了之前的几个类库,上几个核心代码
首先是遍历系统串口,如下
//搜索系统当前串口,并实时显示在选择框中
BYTE i = ;
CString str;
str.Empty();
((CComboBox*)GetDlgItem(IDC_COMBO_PORT_SELECT))->ResetContent();//清除显示项
for(i = ; i < ; i++)
{
if(SIO_OK == sio_open(i))
{
sio_close(i);
str.AppendFormat("COM%d",i);
((CComboBox *)GetDlgItem(IDC_COMBO_PORT_SELECT))->AddString(str);
str.Empty();
}
}
i = ((CComboBox *)GetDlgItem(IDC_COMBO_PORT_SELECT))->GetCount();
if(i ==)
{
GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_BUTTON_SERIAL_CONTROL)->EnableWindow(TRUE);
}
打开串口如下
// TODO: 在此添加控件通知处理程序代码
if(serial_isopen == TRUE)//此时需要关闭串口
{
if(com_port > )
{
if(sio_lstatus(com_port) >= )
sio_close(com_port);
com_port = ;
}
serial_isopen = FALSE;
((CComboBox*)GetDlgItem(IDC_COMBO_PORT_SELECT))->EnableWindow(TRUE);
((CComboBox*)GetDlgItem(IDC_COMBO_BAUD_SELECT))->EnableWindow(TRUE);
((CComboBox*)GetDlgItem(IDC_COMBO_STOP_SELECT))->EnableWindow(TRUE);
((CComboBox*)GetDlgItem(IDC_COMBO_CHECK_SELECT))->EnableWindow(TRUE);
((CComboBox*)GetDlgItem(IDC_COMBO_DATA_BIT_SELECT))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BUTTON_SERIAL_CONTROL))->EnableWindow(TRUE);
((CButton*)GetDlgItem(IDC_BUTTON_SERIAL_CONTROL))->SetWindowText("打开串口");
}
else
{
//获取当前选择的串口号码
int i = ;
CString str;
int config;
if(-==i)
{
MessageBox("请选择一个串口","失败",MB_OK);
return;
}
else
{
((CComboBox*)GetDlgItem(IDC_COMBO_PORT_SELECT))->GetWindowText(str);
str = str.Mid(,str.GetLength());
i = atoi(str);
//检测配置信息
if(baud == 0x80)
{
MessageBox("波特率未选择","错误",MB_OK);
return;
}
if(data_length == 0x80)
{
MessageBox("数据长度未选择","错误",MB_OK);
return;
}
if(stop_bit == 0x80)
{
MessageBox("停止位未选择","错误",MB_OK);
return;
}
if(check_mode == 0x80)
{
MessageBox("校验模式未选择","错误",MB_OK);
return;
}
config = data_length|stop_bit|check_mode;
//开始串口配置
if( sio_open(i) != SIO_OK)
{
MessageBox("串口打开失败","提示",MB_OK);
this->serial_isopen = FALSE;
com_port = ;
return;
}
//运行到这里代表打开成功
com_port = i;
serial_isopen = TRUE;
sio_flowctrl(com_port,0x00);//关闭硬件流控制
sio_lctrl(com_port,0x00);//关闭RTS DTR
sio_ioctl(com_port,baud,config);
sio_flush(com_port,); ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_SELECT))->EnableWindow(FALSE);
((CComboBox*)GetDlgItem(IDC_COMBO_BAUD_SELECT))->EnableWindow(FALSE);
((CComboBox*)GetDlgItem(IDC_COMBO_STOP_SELECT))->EnableWindow(FALSE);
((CComboBox*)GetDlgItem(IDC_COMBO_CHECK_SELECT))->EnableWindow(FALSE);
((CComboBox*)GetDlgItem(IDC_COMBO_DATA_BIT_SELECT))->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_BUTTON_SERIAL_CONTROL))->SetWindowText("关闭串口");
}
}
加载xml文件代码
// 装载配置文件
if(configFileLoadOk == false)//载入文件,载入后按钮变成卸载,下拉列表框变成禁用
{
int i = ((CComboBox*)(GetDlgItem(IDC_COMBO_CONFIG_FILE_SELECT)))->GetCurSel();
CString fileName;
if(i == -)
{
MessageBox("请选择有效文件","提示",MB_OK);
return;
}
else
{
fileName = strPath.GetAt(i);
}
//加载文件
XMLError load = configXmlFile.LoadFile(fileName);
if(load != XML_SUCCESS)
{
MessageBox("文件加载失败","提示",MB_OK);
configFileLoadOk = false;
return;
}
//文件加载成功
XMLElement* pElement;
XMLElement* hRoot;
//加载根节点
hRoot = configXmlFile.RootElement();
if(!hRoot)
{
MessageBox("根节点错误","提示",MB_OK);
return;
}
//根节点加载成功
buttonSendString->RemoveAll();
//加载快捷按键信息
pElement = hRoot->FirstChildElement("button_messages")->FirstChildElement("button");//寻找一个子元素
CString index ;
CString nameString ;
CString promptMessage;
CString serialSendString;
CString enable;
bool enableFlag;
int indexValue;
//获取全部button数据
do
{
index = pElement->FirstChildElement("index")->GetText();
nameString = pElement->FirstChildElement("name")->GetText();
promptMessage = pElement->FirstChildElement("promptmessage")->GetText();
serialSendString = pElement->FirstChildElement("serialSendString")->GetText();
enable = pElement->FirstChildElement("enable")->GetText();
XMLUtil util;
util.ToInt(index,&indexValue);
util.ToBool(enable,&enableFlag);
buttonSendString->Add(serialSendString);
switch (indexValue)
{
case :
GetDlgItem(IDC_BUTTON_SHORT1)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT1)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT1));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT1),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT2)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT2)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT2));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT2),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT3)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT3)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT3));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT3),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT4)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT4)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT4));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT4),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT5)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT5)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT5));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT5),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT6)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT6)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT6));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT6),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT7)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT7)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT7));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT7),promptMessage);
}
break;
case :
GetDlgItem(IDC_BUTTON_SHORT8)->EnableWindow(enableFlag);
if(enable)
{
GetDlgItem(IDC_BUTTON_SHORT8)->SetWindowText(nameString);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT8));
m_toolstip.AddTool(GetDlgItem(IDC_BUTTON_SHORT8),promptMessage);
}
break;
}
pElement = pElement->NextSiblingElement();
} while (pElement); //加载列表框讯息
listSendString->RemoveAll();
pElement = hRoot->FirstChildElement("list_messages")->FirstChildElement("list");//寻找一个子元素
UINT32 num = ;
do
{
index = pElement->FirstChildElement("index")->GetText();
nameString = pElement->FirstChildElement("name")->GetText();
promptMessage = pElement->FirstChildElement("promptmessage")->GetText();
serialSendString = pElement->FirstChildElement("serialSendString")->GetText();
enable = pElement->FirstChildElement("enable")->GetText();
XMLUtil util;
util.ToInt(index,&indexValue);
util.ToBool(enable,&enableFlag);
if(enableFlag)
{
listSendString->Add(serialSendString);
CString show;
show.Empty();
show.AppendFormat("%d 命令名: %s 功能: %s",num,nameString,promptMessage);
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(show);
num++;
}
pElement = pElement->NextSiblingElement();
} while (pElement); int count = ((CListBox*)GetDlgItem(IDC_LIST1))->GetCount();
if(count > )
{
GetDlgItem(IDC_BUTTON_SEND_SHORT_FUCTION)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_SEND_SELECT_SHORT)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_FUNC_SEL)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_ADD_FUNC)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_DELFUNC)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON_DEFAULT)->EnableWindow(TRUE);
} GetDlgItem(IDC_COMBO_CONFIG_FILE_SELECT)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_LOAD_CONFIG_FILE)->SetWindowText("卸载");
configFileLoadOk = true;
}
else
{
((CListBox*)GetDlgItem(IDC_LIST1))->ResetContent(); GetDlgItem(IDC_BUTTON_SHORT1)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT2)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT3)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT4)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT5)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT6)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT7)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT8)->SetWindowText("none");
GetDlgItem(IDC_BUTTON_SHORT1)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT1));
GetDlgItem(IDC_BUTTON_SHORT2)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT2));
GetDlgItem(IDC_BUTTON_SHORT3)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT3));
GetDlgItem(IDC_BUTTON_SHORT4)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT4));
GetDlgItem(IDC_BUTTON_SHORT5)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT5));
GetDlgItem(IDC_BUTTON_SHORT6)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT6));
GetDlgItem(IDC_BUTTON_SHORT7)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT7));
GetDlgItem(IDC_BUTTON_SHORT8)->EnableWindow(false);
m_toolstip.DelTool(GetDlgItem(IDC_BUTTON_SHORT8));
GetDlgItem(IDC_COMBO_CONFIG_FILE_SELECT)->EnableWindow(true);
GetDlgItem(IDC_BUTTON_LOAD_CONFIG_FILE)->SetWindowText("载入"); GetDlgItem(IDC_BUTTON_SEND_SHORT_FUCTION)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_SEND_SELECT_SHORT)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_FUNC_SEL)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_ADD_FUNC)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_DELFUNC)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_DEFAULT)->EnableWindow(FALSE);
configFileLoadOk = false;
}
这些是核心代码,具体工程在下面
http://download.csdn.net/detail/dengrengong/8610539
做自己的串口调试工具-MFC的更多相关文章
- 串口调试者v2.1------开源c#串口调试工具
第一步:上图 第二步:上代码 >>>>>>>>>>>源代码下载<<<<<<<<< ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(3)- 串口功能实现(pySerial)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之串口功能实现. 串口调试助手是最核心的当然是串口数据收发与显示的功能,Jays-PyCOM借助的是 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...
- 串口调试工具(Python2.7+pyserial+Tkinter)
需要与串口设备进行通讯,那么一个调试工具是必须的. 根据我自己的需要,写了个简易版本的串口调试工具: 预览图: ====================== 项目结构: COM --SerialHel ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生. 串口调试助手是嵌入式开发里非常常用的小工具,市面上有非常多流行的串口调试工具,比如TeraTe ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(1)- 环境搭建(Python2.7.14 + pySerial3.4 + wxPython4.0.3)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之环境搭建. 在写Jays-PyCOM时需要先搭好开发和调试环境,下表列出了开发过程中会用到的所有软 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(2)- 界面构建(wxFormBuilder3.8.0)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之界面构建. 一个软件的UI界面是非常重要的,这是软件与用户交互的接口,软件功能即使再强大,但如果没 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之联合调试. 软件开发离不开调试,调试手段分两种:一是黑盒调试,即直接从输入/输出角度测试软件功能是 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(6)- 打包发布(PyInstaller3.3.1)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之打包发布. 经过上一篇软件优化之后,Jays-PyCOM已经初长成,该到了出去历练的时候了,只有经 ...
随机推荐
- 12C cdb/pdb 配置监听
. PDB is not an instance, so using SID in the connection string will not work. When the database is ...
- Windows 常用消息及含义
消息范围 说明 0 - WM_USER – 1 系统消息 WM_USER - 0x7FFF 自定义窗口类整数消息 WM_APP - 0xBFFF 应用程序自定义消息 0xC000 - 0xFFFF ...
- Hibernate 系列教程16-二级缓存
pom.xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate- ...
- php 四种基础算法 ---- 快速排序法
4.快速排序法 代码: function quick_sort($arr) { //先判断是否需要继续进行 $length = count($arr); if($length < ...
- Android简单逐帧动画Frame的实现(二)
Android简单逐帧动画Frame的实现 Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...
- HDU1548:A strange lift
A strange lift Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tota ...
- mysql笔记4之数据操作
1修改数据 插入:insert into stu(id,name,age,addr) values(2,"李四",44,"重庆"); 2修改某一列 updata ...
- zencart hosts本地解析
C:\WINDOWS\system32\drivers\etc\hosts 127.0.0.1 www.aberc220.com 别人 192.168.1.64 www.aberc220.com ...
- Android Studio开发环境的配置
为了使开发人员与时俱进, 在这里给大家讲解一下Android Studio的安装步骤及设置. 使用的是Android的最新版本,0.4.2版本,Android Studio可以脱离Eclipse单独运 ...
- JavaScript返回上一页并自动刷新
返回并刷新 <script>alert("恭喜您,操作成功!"); window.location.href=document.referrer; </scrip ...