之前一共说了几个软件库,串口通讯的,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. linux的学习系列 3---目录

    目录也是一个文件,它的唯一功能是用来保存文件及其相关信息.所有的文件,包括普通文件.设备文件和目录文件,都会被保存到目录中. 主目录 登录后,你所在的位置就是你的主目录(或登录目录),接下来你主要是在 ...

  2. javascript 总结学习一

    1 , javascript字符集:javascript采用的是Unicode字符集编码.为什么要采用这个编码呢?原因很简单,16位的Unicode编码可以表示地球人的任何书面语言.这是语言 国际化的 ...

  3. HDU - 2802 F(N) (周期)

    题目链接:HDU 2009-4 Programming Contest 分析:具有一定的周期性——4018处理下就可以A了 Sample Input Sample Output AC代码: #incl ...

  4. 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

    3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 243  Solved: 167[S ...

  5. php basename()文件夹 路径 文件后缀名 读取pathinfo()

    $path = "/www/mywebsite/images/myphoto.jpg"; 1.pathinfo()函数 pathinfo()函数返回的是一个包含了文件信息的数组,数 ...

  6. 区间gcd问题 HDU 5869 离线+树状数组

    题目大意:长度n的序列, m个询问区间[L, R], 问区间内的所有子段的不同GCD值有多少种. 子段就是表示是要连续的a[] 思路:固定右端点,预处理出所有的gcd,每次都和i-1的gcd比较,然后 ...

  7. IPoint Interface接口

    Description A Point is a zero-dimensional object that represents a specific (X, Y) location in a the ...

  8. 关于submit与document.form1.submit();这2个提交的区别

    首先要知道 一个是按钮提交 一个是在js函数里写代码 document.form1.submit() 提交 区别如下: 从使的方式及效主要有二点区别吧.一.使用submit()提交时,表单中不能存在s ...

  9. 1.3 selenium IDE录制脚本转换为其他代码格式

    1.在seleniumIDE录制框中点击Options->options... 在Enable experimental features前打对勾,点击确定.

  10. VMware克隆CentOS虚拟机后固定IP的问题

    由于克隆虚拟机,VMware只是修改了虚拟机的名字等信息,并没有修改虚拟硬盘中的任何信息,导致克隆后网卡的MAC地址和操作系统中记录的mac地址不符,导致eth0启动不起来.操作系统记录了一个新网卡的 ...