“拿来主义”——怎样嗅探一个串口通信程序与硬件之间的通信(一)

VC编程经验 专栏收录该内容
4 篇文章 0 订阅

前言

这是最好的时代,也是最坏的时代,这是一个鼓励创新的时代,但是也是一个抄袭满地的时代。
事实上,不站在巨人的肩膀上,没有明确的社会分工,以人类有限的声明,科学永远无法进步。


概述

跑题太远哈哈哈,很多硬件生产厂家都提供了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])的方式实现对计算机与被控硬件之间通信内容的嗅探

嗅探原理


嗅探程序开发

要求:

  1. 程序能够同时控制两个串口
  2. 能够显示两个串口收到的内容
  3. 能够将其从虚拟串口收到的已有程序发出的内容转发至实际串口
  4. 能够将其从物理串口收到的被控硬件发出的内容转发至已有程序

直接用最简单的方法:
创建一个基于对话框的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类

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值