开篇
大家好,这篇文章是我之前写的开源串口调试软件Common的文档。很久很久之前都说要提笔写的,结果拖了很久,抱歉。
原来在博客园的文章:http://www.cnblogs.com/memset/archive/2012/12/24/common.html
先介绍下吧,这是一款开源的串口(RS232)调试助手软件,取名为Common,之所以取这个名,是因为其实最初我是想把她做成串口监视器的(Communication Monitor,Common),但后来由于能力不够,就放弃了,做成了串口调试软件。她运行在Windows平台上。最初的开发语言是纯C语言,后来经维护,慢慢地变成了C++,然后是C++加部分的C++11,变更开发的语言,其主要也是正在学习这些语言,想要通过实际的项目经验来达到学习的目的。软件最初的开发时间大概是2012年12月24日,当时我正在学校的电子实验室进行单片机方面的学习,由于单片机很多时候没有显示设备,不方便调试,所以就经常用串口,所调试数据输出到电脑端上位机来进行调试。之间用过几个国内的比较流行的串口调试软件,发现都不符合我自己的习惯,于是就花了点时间自己写了一个。没想到一写就写了两年多,直到大四那年(2015),我从Windows+单片机的开发,转到了Linux+嵌入式(网络)(我本身的专业就是嵌入式),所以渐渐地,就更新得特别慢了,有了不再更新的念头。
下载
跟源代码一样,最终的程序下载地址同样是在GitHub上,地址是:https://github.com/movsb/common/releases
功能介绍
本软件提供了以下基本功能:
- 串口数据的读取与发送;
- 设置波特率、停止位、数据位、校验位;
- 以十六进制和字符方式显示接收数据;
- 支持自动发送,可设置自动发送间隔时间;
- 显示发送数据量、接收数据量;
本软件还提供了以下额外功能:
- 自动枚举系统所有可用串口设备(虚拟的、物理的、USB转串口的);
- 任意设置通信波特率(手动输入),但得设备(设备驱动支持);
- 支持保存接收数据到文件(十六进制、字符格式);
- 支持加载文件并发送,多种格式(纯文本、二进制、十六进制序列、命令列表(手动配置));
- 字符模式支持设置换行符类型(回车换行、回车、换行、无),支持转义字符(如:\x12, \xab, \r, \n, \t, \a, \b 等等);
- 支持部分Linux终端控制字符,包括:前景颜色、背景颜色、字节加粗等;
- 支持显示ASCII码表(0-255),以及对应的十进制、八进制、十六进制;
- 支持从接收窗口区域直接输入待发送内容;
- 支持简洁模式、支持窗口全屏模式;
- 支持快捷打开计算器、设备管理器、记事本等系统程序;
关于版权与免责声明
本串口调试软件(以下简称“本软件”软件完全开放源代码,目前无协议。但仅限个人使用,任何公司在未得到作者允许前不得将本软件用于任何商业用途。
本软件由作者独立开发完成,限于作者能力有限,可能难免会出现BUG或程序错误,虽然我已经尽力编码使本软件不产生BUG。本人不对本软件所造成的任何个人(或集体)的任何损失负责,所有风险由您自己承担。您只有接收了该条款,您才能使用本软件。一旦您使用了本软件,即代表您接受本条款。
软件的安全性
本软件可运行在Windows XP及以上的所有系统中,一共两个文件(EXE本身+一个配置文件),没有任何其它附带程序,也不依赖任何MFC相关库。
本软件完全开源,除了会修改本软件自身的配置文件以外,不会增删修改任何文件,包括但不限于:磁盘文件、系统设置、注册表、安装信息等。下载即用。至于某些“安全”软件所报的“本软件携带恶意代码”、“本软件为病毒”,等等。其它的我不想多说什么,我只是劝告你们,尽早卸载掉这些所谓的“安全”的不安全软件,还自己一片干净、清爽的天空。
软件源代码的编译
本软件是完全开源软件,并采用 git 维护,项目在 GitHub 上面。地址是:https://github.com/movsb/common.git。如果不会使用 git,则可以直接下载打包文件,在项目主页右边,有个“Download ZIP”,点击即可下载。如果会的话,git clone 就可以了。
软件是用C++/C++11,而且运行在Windows之上,所以必须采用Visual Studio 2013及以上才行!低版本都不行,也没有低版本可用,所以不用再问我是否有VC6.0的版本之类的了,没有哦!用VS2013打开根目录下的 .sln 文件即可打开项目,然后编译并链接就可得到相应的可执行文件。如果遇到错误,请接着往下看。
界面布局的管理
本软件通过一个叫做 sdklayout 的小项目来管理本软件的界面布局,其通过 xml 来布局窗口及其控件,与控件、窗口相关的大小、位置、显示与隐藏等信息全部由其管理。
主窗口的界面布局在 main_orig.xlm 中,文件中引用字符串串形式的控件ID,但Windows内部是以数字ID形式使用的。为了考虑运行时的效率,所以把转换工作换在了编译时,也就是说要把 main_orig.xml 中的字符串ID形式,通过资源文件,转换成数值ID的形式。这需要借助另一个小工具。这个工具叫做 idxml,名字是随便取的,知道功能就好了!软件也在 github 上面,地址是:https://github.com/movsb/sdklayout.git。但是为了大家的方便,我已打算将最终的exe文件放在了 tools 目录,采用VS2013+兼容XP+无MSVCRT依赖,所以最终生成的EXE偏大,有接近200KB。本程序是基于命令行的,所以要在CMD命令行下执行,因此不要再问我为什么窗口一打开就自动关闭了类似的问题!
软件使用命令:idxml <in_xml> <resource.h> [out_xml]
其中的 ``in_xml`` 为输入xml(如:main_orig.xml),``resource.h`` 为窗口所在的资源文件,``out_xml`` 为输出xml(如 main.xml),可省略。
2015年10月14日更新:写了一个自动脚本,用于完成上面的转换工作,见 tools/gen_main_xml.bat 文件。
XML文件的解析库 tinyxml2
同样为了方便大家的使用,我已经把tinyxml2集成到项目中了。不用再去下载。
关于找不到 ``afxres.h``
本软件完全采用Win32SDK写成,未使用任何MFC相关的库,所以本身并不会依赖于 AFX 的,但 Windows 有时候会抽风,报找不到 afxres.h 错误。解决办法如下:
打开 common.rc,定位到大概第10行左右,有一行是:#include "afxres.h",把这行干掉,改成以下两行即可:
#include <Windows.h>
#include <winres.h>
软件更新历史
2012-12-24 1.0.0.0: 发布第1个版本 2012-12-26: 自动识别当前存在,插入,移除的串口号 2013-01-11 1.0.0.1: 增加保存接收区数据到文件(16进制/文本形式) 增加从文件读数据到发送区(16进制/文本形式) 增加暂停显示功能 增加复制发送/接收区数据到剪贴板 2013-01-18 1.0.0.2: 修复:文本文件,16二进制文件读取错误 修复:程序内部缓冲区满后使程序进入死循环 修复:文本字符方式显示接收的数据时产生不正确的换行符的错误,若要产生换行符, 请使用"\n" 2013-02-08 1.0.0.3: 内部程序作了许多的优化工作,包含数据的发送方式等 修复接收数据时鼠标在接收区的文本选择造成的干扰 2013-02-14 1.0.0.4: 增加显示出0~127号ASCII对应8,10,16进制功能 2013-02-24 1.0.0.5,今天元宵节: 更改原来的1~64串口列表到自动检测计算机上的可用串口 2013-02-27 1.0.0.6: 若发送文本,则自动发送被自动取消(若自动发送选项已打开) 在显示模式下不允许对接收区数据进行选择操作 提供硬件支持的串口设备设置 为用户提供串口超时设置 提供手动设置DTR/RTS引脚电平 2013-03-01 1.0.0.7: 修改原计算器(系统)为表达式求值计算器(简单版本) 2013-03-03: 添加:<其它>菜单添加<设备管理器> 修改:在关闭串口后自动发送前面的钩不再自动取消(如果已经选中) 修改:串口被关闭/移除后串口列表回到第一个串口设备的BUG 2013-03-04: 修改:现在在串口列表中可以显示串口在设备管理器中的名字了 修正:无法显示 MSP430-FETUIF Debugger 的串口号(现在调用SetupApi更新列表) 2013-03-05: 为了方便数据的统计与显示,16进制内容与字符内容被显示到不同的编辑框中 2013-03-09 1.0.0.8: 修正在使用SetupApi枚举串口设备时未检测并口设备而造成的内存异常访问错误 减少在某些波特率(如:19200bps)下丢包严重的情况(如:MSP430串口),有时候还是会发生,等待修复.某些软件(如:SComAssistant采用每次只读一个字节的办法效果还行, 就是速度有点慢. 我改成了WaitCommEvent函数调用了(原来是Pending ReadFile),减少了CPU占用(有些串口驱动并不总是支持同步操作). 以前只管ReadFile+输出nRead字节,这里错误,ReadFile并不保证读取到要求的数据量后才返回,这里会导致严重丢包,WriteFile亦然. 速度减慢,但数据更完整 2013-03-10 1.0.0.9: 修正:因为在格式化字符串的最后少写了一句 *pb = '\0',导致接收区数据显示错误! 修复:对utils.hex2chs和add_text作了大量修改,大大减少数据丢包,貌似没有丢包?,细节处理参见源程序 1.0.0.8版本因为内部原因速度严重减慢, 1.0.0.9回到原来的快速! 2013-03-18: 更正:若为字符显示方式,16进制方式保存不被允许,因为格式基本上不满足! 2013-03-23 1.10: 添加:工作模式中,右键点击接收区字符文本框可以使能中文显示模式(不推荐),由于中文字符由两个字节构成,所以:一旦在某一次接收过程中只接收到了中文字符的一个字节,那么数据就会显示出错, 这个无法避免, 所以建议尽量不使能中文显示模式. 修正:用C语言的人们都习惯使用'\n'作为换行符,我也这样使用,但偏偏Windows的编辑框以'\r\n'作为换行符,没有办法,我不得不把所有的'\n'换成'\r\n',效率必然会下降,而且我不得不计算出\n的个数先 --> 为了计算所需缓冲区的大小. 添加:现在可以显示出还未被发送出去的数据计数. 添加:新增计时器,打开串口后开始计时,关闭后停止计时. 2013-03-25: 修正:大大减少中文乱码的问题.细节处理见代码.现在应该可以放心地使能中文显示模式了. 增加:字符串转16进制数组功能,工具菜单里面. 2013-04-04: 修正:无法复制接收区字符文本的BUG. 小提示:在选择串口时,如果没有任何可用的串口,则进行提示更新. 2013-04-07: 修改:完全修改了utils.str2hex的实现,大大增加了16进制输入的灵活性. 现在的要求:每个16进制值由两个相邻字符组成,无其它限制.(以前是2个相邻字符+一个空格) 2013-04-11: 发送字符数据时,对于换行,只发送'\n',不再发送'\r\n',注意:结尾的'\0\'不被发送! 2013-04-13: 修正:更改发送与接收方式为异步方式. 添加:简单波形显示. 2013-04-23: 修正:发送与接收方式改回同步方式!坑~ 修正:当发送操作达到100次时无法继续发送的BUG! 修改:优化内部线程同步机制,避免程序停止工作(失去响应)! 优化:优化自动发送数据的方式,提高精度,减小内存/CPU占用! 小提示:在加载/保存文件时,若不清楚打开/保存方式,可以查看简单的帮助信息! 2013-05-11:明天母亲节 修正:终于找到一个比较好的办法来处理自动发送用到的重复数据了,呵呵,时间下限减少到10ms 2013-07-05: 临时修正:选择从文件加载并取消后, 串口号选择的ComboBox会消失不见,不知道原因,临时已解决 2013-07-14: 改进:程序内部改进内存分配算法,避免因程序错误造成内存泄漏 2013-07-20 1.12: (过渡版本,以后更新) 2013-07-27: 细节:主窗口最小化后其它子窗口不自动最小化的问题 2013-08-29: 修正:在设备管理器中更改串口的端口号后, 自动刷新串口列表 细节:修正在串口打开且允许显示接收到的数据时无法使用鼠标滚轮的小问题 2013-08-30: 细节:根据用户要求,窗口大小现在可以变化; 如果不满意于接收/发送区的文本框过小, 可以左右拖动窗口以改变窗口大小 细节:由于原来接收区没有水平滚动条,所以数据可能自动被换行, 现在已纠正,数据不再自动换行, 要换行, 请使用 '\n' 2013-09-10 1.13: 增加:现在可以手动编写待发送的命令文件,并发送命令了 - 在发送文件时选择 命令文件, 格式见博客后面的介绍 增加:字符发送模式下,可以选择取消回车换行符的发送,可以选择插入转义字符 1.支持的字符型转义字符: \r,\n,\t,\v,\a,\b,\\ 2.支持的16进制转义字符格式: \x?? - 其中一个问号代表一个16进制字符, 不可省略其一, 必需保证4个字符的格式 3.'?',''','"', 等print-able字符不需要转义 2013-11-02 1.14: 修改:完全修改了命令发送的界面,比原来方便了很多~ 2013-11-06: 修正:如果接收缓冲区有未显示的数据,则会在按下继续显示时进行提示,而不是原来的在接收到下一次的数据时进行提示;感谢网友lin0119的反馈 2014-03-03: 1.15 增加:支持输入非标准的波特率, 但是驱动是否能够支持, 要看具体的驱动了 改进:加入了一些快捷键, 比如Alt+S为发送... 2014-07-05: 1.16 ①字符接收数据时,增加对控制字符Backspace的支持(即'\b'),效果就是向前删除一个字符 ②修复一处中文检测错误(原来是对的, 不知道什么时候改错了 ③删除了窗体大小调整(下个版本即将使用自动布局) 2014-07-06: 1.17 ①增加:允许从接收区输入字符并发送(更友好的类交互模式) ②更改:更改了字符接收区/发送区的字体为Consolas等宽字体,不再使用原来的Courier字体 ③增加:简洁模式 - 此模式下大部分界面元素会被隐藏, 有时候这样更舒服 ④增加:主窗口的自动界面布局(允许拖动改变窗口大小,控件坐标自动调整) ⑤更改:默认使用的模式改为:字符接收+字符发送 2014-08-09: 1.18 Beta 优化:简化对数据中包含'\0'的数据的处理 增加:简洁界面模式时把工具栏放到左边 增加:接收区增加一个"清空数据"菜单 更改:不限制接收数据的多少 优化:完美实现4种换行符的统一, 就算'\r\n'分两次发送也会正确地产生仅一个换行符! 优化:主窗口应用新的布局方案 修复:修复错误解析16进制转义字符问题 修复:解决一个中文字符分两次发送的乱码问题 2015-08-02: 1.19 久违了 修复了“保存到文件”功能 解决无法识别虚拟串口的问题 && 解决某些不支持的事件导致 SetCommMask 失败问题 编辑框增加常用功能:鼠标中键删除,计算器 去掉了一些不需要的功能 libtccw32, str2hex, pinctrl 2015-09-13: 1.20 没有什么修改,只是整理了文档没做什么实质性的修改,增加了文档,集成了idxml和tinyxml工具库
https://blog.twofei.com/566/