(串⼝通信编程)开源串⼝调试助⼿
Common(ComMonitor)
开篇
⼤家好,这篇⽂章是我之前写的开源串⼝调试软件Common的⽂档。很久很久之前都说要提笔写的,结果拖了很久,抱歉。
先介绍下吧,这是⼀款开源的串⼝(RS232)调试助⼿软件,取名为Common,之所以取这个名,是因为其实最初我是想把她做成串⼝监视器的(Communication Monitor,Common),但后来由于能⼒不够,就放弃了,做成了串⼝调试软件。她运⾏在Windows平台上。最初的开发语⾔是纯C语⾔,后来经维护,慢慢地变成了C++,然后是C++加部分的C++11,变更开发的语⾔,其主要也是正在学习这些语⾔,想要通过实际的项⽬经验来达到学习的⽬的。软件最初的开发时间⼤概是2012年12⽉24⽇,当时我正在学校的电⼦实验室进⾏单⽚机⽅⾯的学习,由于单⽚机很多时候没有显⽰设备,不⽅便调试,所以就经常⽤串⼝,所调试数据输出到电脑端上位机来进⾏调试。之间⽤过⼏个国内的⽐较流⾏的串⼝调试软件,发现都不符合我⾃⼰的习惯,于是就花了点时间⾃⼰写了⼀个。没想到⼀写就写了两年多,直到⼤四那年(2015),我从Windows+单⽚机的开发,转到了Linux+嵌⼊式(⽹络)(我本⾝的专业就是嵌⼊式),所以渐渐地,就更新得特别慢了,有了不再更新的念头。
下载
功能介绍
本软件提供了以下基本功能:
1. 串⼝数据的读取与发送;
2. 设置波特率、停⽌位、数据位、校验位;
3. 以⼗六进制和字符⽅式显⽰接收数据;
4. ⽀持⾃动发送,可设置⾃动发送间隔时间;
5. 显⽰发送数据量、接收数据量;
本软件还提供了以下额外功能:
1. ⾃动枚举系统所有可⽤串⼝设备(虚拟的、物理的、USB转串⼝的);
2. 任意设置通信波特率(⼿动输⼊),但得设备(设备驱动⽀持);
3. ⽀持保存接收数据到⽂件(⼗六进制、字符格式);
4. ⽀持加载⽂件并发送,多种格式(纯⽂本、⼆进制、⼗六进制序列、命令列表(⼿动配置));
5. 字符模式⽀持设置换⾏符类型(回车换⾏、回车、换⾏、⽆),⽀持转义字符(如:\x12, \xab, \r, \n, \t, \a, \b 等等);
6. ⽀持部分Linux终端控制字符,包括:前景颜⾊、背景颜⾊、字节加粗等;
7. ⽀持显⽰ASCII码表(0-255),以及对应的⼗进制、⼋进制、⼗六进制;
8. ⽀持从接收窗⼝区域直接输⼊待发送内容;
9. ⽀持简洁模式、⽀持窗⼝全屏模式;
10. ⽀持快捷打开计算器、设备管理器、记事本等系统程序;
关于版权与免责声明
本串⼝调试软件(以下简称“本软件”软件完全开放源代码,⽬前⽆协议。但仅限个⼈使⽤,任何公司在未得到作者允许前不得将本软件⽤于任何商业⽤途。
本软件由作者独⽴开发完成,限于作者能⼒有限,可能难免会出现BUG或程序错误,虽然我已经尽⼒编码使本软件不产⽣BUG。本⼈不对本软件所造成的任何个⼈(或集体)的任何损失负责,所有风险由您⾃⼰承担。您只有接收了该条款,您才能使⽤本软件。⼀旦您使⽤了本软件,即代表您接受本条款。
软件的安全性
本软件可运⾏在Windows XP及以上的所有系统中,⼀共两个⽂件(EXE本⾝+⼀个配置⽂件),没有任何其它附带程序,也不依赖任何MFC相关库。
本软件完全开源,除了会修改本软件⾃⾝的配置⽂件以外,不会增删修改任何⽂件,包括但不限于:磁盘⽂件、系统设置、注册表、安装信息等。下载即⽤。⾄于某些“安全”软件所报的“本软件携带恶意代码”、“本软件为病毒”,等等。其它的我不想多说什么,我只是劝告你们,尽早卸载掉这些所谓的“安全”的不安全软件,还⾃⼰⼀⽚⼲净、清爽的天空。
软件源代码的编译
软件是⽤C++/C++11,⽽且运⾏在Windows之上,所以必须采⽤Visual Studio 2013及以上才⾏!低版本都不⾏,也没有低版本可⽤,所以不⽤再问我是否有VC6.0的版本之类的了,没有哦!⽤VS2013打
开根⽬录下的.sln ⽂件即可打开项⽬,然后编译并链接就可得到相应的可执⾏⽂件。如果遇到错误,请接着往下看。
界⾯布局的管理
本软件通过⼀个叫做 sdklayout 的⼩项⽬来管理本软件的界⾯布局,其通过 xml 来布局窗⼝及其控件,与控件、窗⼝相关的⼤⼩、位置、显⽰与隐藏等信息全部由其管理。
软件使⽤命令:idxml <in_xml> <resource.h> [out_xml]
其中的``in_xml`` 为输⼊xml(如:l),``resource.h`` 为窗⼝所在的资源⽂件,``out_xml`` 为输出xml(如l),可省略。
2015年10⽉14⽇更新:写了⼀个⾃动脚本,⽤于完成上⾯的转换⼯作,见 tools/gen_main_xml.bat ⽂件。
XML⽂件的解析库 tinyxml2
同样为了⽅便⼤家的使⽤,我已经把tinyxml2集成到项⽬中了。不⽤再去下载。
关于不到 ``afxres.h``
本软件完全采⽤Win32SDK写成,未使⽤任何MFC相关的库,所以本⾝并不会依赖于AFX 的,但Windows 有时候会抽风,报不到afxres.h 错误。解决办法如下:
打开 ,定位到⼤概第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进制/⽂本形式)vs编程软件
增加暂停显⽰功能
增加复制发送/接收区数据到剪贴板
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串⼝列表到⾃动检测计算机上的可⽤串⼝
更改原来的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⼯具库

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。