之前一共说了几个软件库,串口通讯的,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的更多相关文章

  1. 串口调试者v2.1------开源c#串口调试工具

    第一步:上图 第二步:上代码 >>>>>>>>>>>源代码下载<<<<<<<<< ...

  2. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(3)- 串口功能实现(pySerial)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之串口功能实现. 串口调试助手是最核心的当然是串口数据收发与显示的功能,Jays-PyCOM借助的是 ...

  3. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...

  4. 串口调试工具(Python2.7+pyserial+Tkinter)

    需要与串口设备进行通讯,那么一个调试工具是必须的. 根据我自己的需要,写了个简易版本的串口调试工具: 预览图: ====================== 项目结构: COM --SerialHel ...

  5. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生. 串口调试助手是嵌入式开发里非常常用的小工具,市面上有非常多流行的串口调试工具,比如TeraTe ...

  6. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(1)- 环境搭建(Python2.7.14 + pySerial3.4 + wxPython4.0.3)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之环境搭建. 在写Jays-PyCOM时需要先搭好开发和调试环境,下表列出了开发过程中会用到的所有软 ...

  7. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(2)- 界面构建(wxFormBuilder3.8.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之界面构建. 一个软件的UI界面是非常重要的,这是软件与用户交互的接口,软件功能即使再强大,但如果没 ...

  8. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(4)- 联合调试(vspd, sscom, PyCharm2018.2)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之联合调试. 软件开发离不开调试,调试手段分两种:一是黑盒调试,即直接从输入/输出角度测试软件功能是 ...

  9. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(6)- 打包发布(PyInstaller3.3.1)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之打包发布. 经过上一篇软件优化之后,Jays-PyCOM已经初长成,该到了出去历练的时候了,只有经 ...

随机推荐

  1. CodeForces 566B Replicating Processes

    #include <bits/stdc++.h> #define N 3010 #define LL long long #define unsigned U using namespac ...

  2. World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)

    分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用dp[i][j]表示到达i时间,j车站在地上已经等待的最小时间,决策方式有三种,第一种:等待一秒钟转移到dp[i+1][j]的状态,代 ...

  3. Linux学习 -- 备份与恢复

    备份 Linux系统需要备份的数据 /root/ /home/ /var/spool/mail /etc/ others 备份策略 完全备份 增量备份 差异备份 备份和恢复命令 dump  resto ...

  4. 转:Selenium Grid+JAVA +Windows 配置(Selenium 2.0)

    Selenium-Grid 允许你在多台机器的多个浏览器上并行的进行测试,也就是说,你可以同时运行多个测试.本质上来说就是,Selenium-Grid 支持分布式的测试执行.它可以让你的测试在一个分布 ...

  5. Linux 下 git的使用

    参考链接:http://www.liaoxuefeng.com 安装 安装步骤: ①先给操作系统装入git工具,以Linux为例: $ sudo apt-get install git ②去githu ...

  6. index.do为后缀的是什么开发语言? 有什么技术特点?

    @Override 重写父类的方法.@Nullable 表示定义的字段可以为空. 一般情况下扩展名可以体现出一个网站使用的技术,***.html?id=***,这个就是普通的html页面,然后通过ja ...

  7. Base64笔记

    1. 昨天的<MIME笔记>中提到,MIME主要使用两种编码转换方式----Quoted-printable和Base64----将8位的非英语字符转化为7位的ASCII字符. 虽然这样的 ...

  8. create a new table for the query results

    http://stackoverflow.com/questions/2698401/how-to-store-mysql-query-results-in-another-table CREATE ...

  9. 浅谈ajax的优点与缺点

    AJAX (Asynchronous Javascript and XML) 是一种交互式动态web应用开发技术,该技术能提供富用户体验. 完全的AJAX应用给人以桌面应用的感觉.正如其他任何技术,A ...

  10. maven项目如何跳过某些junit test,或者指定执行部分junit test

    maven-surefire-plugin的插件提供了对测试目录的配置,想要细看的或者学习更多东西的可以去http://maven.apache.org/surefire/maven-surefire ...