做自己的串口调试工具-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已经初长成,该到了出去历练的时候了,只有经 ...
随机推荐
- 转 由一次磁盘告警引发的血案:du 和 ls 的区别
如果你完全不明白或者完全明白图片含义, 那么你不用继续往下看了. 否则, 这篇文章也许正是你需要的. 背景 确切地说,不是收到的自动告警短信或者邮件告诉我某机器上的磁盘满了,而是某同学人肉发现该机器写 ...
- Mybatis 一对一,一对多,多对一,多对多的理解
First (一对一) 首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任.好吧这就是对于一对一的理解 怎么来实现呢? 这里我介绍了两种方式: 一种是:使用嵌套结果映射 ...
- OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试
片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...
- linux shell 远程执行命令
经常要部署多台服务器上面的应用,如果一个个机器的登录太麻烦. 所有就想到编写一个脚本来部署不同的服务器 前提条件: 配置ssh免登陆 如果不会的请参加我的另外一篇文章 http://blog.csdn ...
- 2015年4月29日 dayofweek
#include <stdio.h>#include <stdlib.h>int DayofYear(int year, int month, int day);#define ...
- Gym 100518E Embedding Caterpillars
构造+DFS 很容易的可以构造两个,最后一个不会构造的话 DFS一下就可以了 #include<iostream> #include<string> #include< ...
- posix信号量(sem_t)
引言 信号量分为三种:posix有名信号量(使用Posix IPC名字标识,至少具有随内核的持续性)/posix基于内存的信号量(共享内存,随进程的持续性)/System V 信号量(内核) 有了互斥 ...
- dfs和bfs的简单总结
首先是dfs,又名深度优先搜索.看名字就知道,它的核心思想就是一直搜索,先在一条路上面一路撸到底,如果到底没有办法前进了,那么判断是否到达终点,如果没有到达,那么就回溯到之前的点再撸. dfs的要点: ...
- L5,no wrong numbers
expressions: up to now,到现在为止 a great many,数量很大 in a way,在某种意义上说 words: burn,vt燃烧,vi烧毁,n灼烧 obtain,v ...
- JavaScript基础教程
功能介绍: (1)数据验证 弹出提示的对话框,产生判断的效果. (2)气泡提示窗口 右下角等等一类的窗口 (3)产生新窗口 (4)无边框窗口背景变灰,也是可以节约系统资源的