做自己的串口调试工具-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已经初长成,该到了出去历练的时候了,只有经 ...
随机推荐
- NBUT 1120 线段树
input q n q行 F a b或者Q a b output face left face top face right 可以用map或者线段树做 //map #include<cstdio ...
- fidder 调试本地文件
- CodeForces 567B Berland National Library
Description Berland National Library has recently been built in the capital of Berland. In addition, ...
- Java8学习笔记----Lambda表达式 (转)
Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...
- opencart配置税率
1.System->Localisation->Geo Zones新增税收区域 2.System->Localisation->Taxes->Tax Rates新增税率 ...
- [学习opencv]高斯、中值、均值、双边滤波
http://www.cnblogs.com/tiandsp/archive/2013/04/20/3031862.html [学习opencv]高斯.中值.均值.双边滤波 四种经典滤波算法,在ope ...
- 教你用CSS代码写出的各种形状图形
做网页设计时经常要用到各种形状的图形,对于规则的图形很简单,但是对于不规则的图形,一般我们都是用图片,今天就在这里教大家怎样用css代码写出各种规则不同的图形 1.正方形 #square {width ...
- 解决phpmyadmin上传文件大小限制的配置方法(转)
phpmyadmin导入SQL文件时涉及到phpmyadmin上传文件大小限制问题,默认phpmyadmin上传文件大小为2M,如果想要 phpmyadmin上传超过2M大文件,就需要修改phpmya ...
- Mysql 随机查询数据
SELECT * FROM tablename ORDER BY RAND() LIMIT 10
- Linux 查看 硬件配置
一:查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如 ...