前言
这是最好的时代,也是最坏的时代,这是一个鼓励创新的时代,但是也是一个抄袭满地的时代。
事实上,不站在巨人的肩膀上,没有明确的社会分工,以人类有限的声明,科学永远无法进步。
概述
跑题太远哈哈哈,很多硬件生产厂家都提供了API,但是在看那些E文说明书的时候总也不能很好的理解它们的意思,厂家虽然也提供了示例程序,但是有些厂家偷懒就是不给源代码,尤其是计算机与硬件之间用RS-232串口相连就更bt了,退一步你用485的话我还能简单的甩出两根线监测一下软件和设备之间的信息往来,232从硬件上解决则相对困难些,除非你手头有台示波器你自己还愿意折腾……
幸而看到了一本书:独辟蹊径的编程思维:”拿来主义”编程[1],里面介绍的方法比较好的解决了这个问题,底下的超链接是亚马逊的购买链接……不知道有没有免费的电子版,不过还是支持正版一下吧
作者采用了一个叫做VSPE的软件来虚拟串口,进而通过自己编写程序完成对串口通信程序与硬件之间通信的嗅探,更好的实现已有程序的“为我所用”。高手如果熟悉这个流程了就可以点击屏幕右上角的关闭按钮了~
下面也是自己的一个历程,刚开始做,之后会不定期更新,但愿不要烂尾。
VSPE简介
以下内容援引自[1]:
VSPE(Virtual Serial Ports Emulator,虚拟串口仿真)是Eterlogic公司出品的一套虚拟串口仿真驱动程序,其作用是通过各种特殊的方式,处理串口中遇到的几乎所有与具体的串口应用无关,但与串口的监听却息息相关的事情
Eterlogic公司的网站上:
http://www.eterlogic.com/Products.VSPE.html
可以免费下载到32位的版本
应用它的“连接器”模式创建出一个“虚拟串口”:Com A
这个Com A可以重复的被多个程序打开,且各个程序可以借由这个Com A实现互相之间的通信
进一步的结合自己编写的一个程序与“物理串口”:Com B
就可以通过下图(引自[1])的方式实现对计算机与被控硬件之间通信内容的嗅探
嗅探程序开发
要求:
- 程序能够同时控制两个串口
- 能够显示两个串口收到的内容
- 能够将其从虚拟串口收到的已有程序发出的内容转发至实际串口
- 能够将其从物理串口收到的被控硬件发出的内容转发至已有程序
直接用最简单的方法:
创建一个基于对话框的MFC程序
以下内容参考了[2]和[3],其中针对多个串口进行操作的方法主要参考了[3]
1.在“xxxDlg.h”当中添加对应的头文件(xxx是你创建的对话框类的名称,下同):
#include "SerialPort.h"
2.在“xxxDlg.h”当中添加消息响应函数声明
afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);
暂时将这部分代码放在了 Protect:之下,不知道是不是这样
但是可以肯定的是,[2]中的这个声明被我直接照搬的时候出现了问题,[2]中的这个函数返回为void,但是在改成LONG之前,编译一直不通过
3.在“xxxDlg.cpp”中,添加消息声明:
BEGIN_MESSAGE_MAP(CSerialPort01Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
///////////////////////////////////////////////////
// 串口编程
///////////////////////////////////////////////////
ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
///////////////////////////////////////////////////
END_MESSAGE_MAP()
需要添加的是上述代码中“串口编程”包围的部分
4.在“xxxDlg.cpp”当中加入消息响应函数的实现(这部分比较重要,它决定了程序在收到数据后要干些什么,目前只是一个构架)
LONG CSerialPort01Dlg::OnCommunication( WPARAM ch, LPARAM port )
{
///////////////////////////////////////////////////
// 接收后处理
///////////////////////////////////////////////////
return 0;
}
5.创建串口类变量及相关变量:在“xxxDlg.h”当中添加变量声明
// 串口变量
public:
CSerialPort m_comm_Port[2]; //需要控制两个串口
CString m_strRXDataCOM_Virtual; //虚拟串口接收数据
CString m_strRXDataCOM_Real; //物理串口接收数据
这两个类变量负责分别控制两个串口的打开等等行为
字符串变量如注释描述
至此,一个基本的框架被建立起来,程序的具体代码见后续内容
参考
[1] 独辟蹊径的编程思维:”拿来主义”编程
[2] 在VC中使用SerialPort类实现串口通信
[3] 简单而强大的多线程串口编程工具CserialPort类