虚拟串口模拟器和串口调试助手使用教程

news/2025/2/15 17:30:54/

虚拟串口(虚拟 COM 端口),应该很多人都知道,也就是一种模拟物理串行接口的 软件 它完全复制了硬件 COM 接口的功能,并且将被操作系统和串行应用程序识别为真实端口。

以前的电脑,基本标配都包含一个串口。但现在的电脑,基本都没有配置串口了。如果要使用串口的功能,基本就要用一个USB转串口的硬件模块。

现实生活中,虚拟串口用处很多。比如:你的应用程序检测串行输入数据的时候,方便调试。还比如:多个有应用程序之间使用串口通信。

虚拟串口软件推荐:强大的虚拟串口软件


串口调试助手软件有很多,随便选一个自己习惯的即可。


演示一下串口模拟器和串口调试助手使用

打开VSPD,添加虚拟串口

在这里插入图片描述

打开串口调试助手,设置好必要的参数

https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210801141400770.png
https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210801141420257.png

打开两个串口,在其中一个串口中发送区写入消息,点击发送,在另一个串口的接收区可以看到我们发送的消息

在这里插入图片描述

两个串口的连接示意图如下图所示

image-20210801143004531

数据传输路线有两条

  • 串口调试助手1–>COM1–>COM2–>串口调试助手2
  • 串口调试助手2–>COM2–>COM1–>串口调试助手1

在Windows下使用C语言调用串口,接收发送数据

https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210801144941433.png

C语言程序测试接收代码如下:

#include<stdio.h>
#include<windows.h>int main()
{FILE *fp;if ((fp = fopen("com1", "r")) == NULL){printf("cannot open com!\n");}elseprintf("open com successful!\n");char str;while (1){fscanf(fp, "%c", &str);printf("%c ", str);Sleep(100);}return 0;
}

运行

https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210801150720719.png

因为这个程序打开的是COM1,因此我么在COM2的串口调试助手中,在发送区输入要发送的值,点击发送
在这里插入图片描述
这是可以在运行串口看到接收并且打印出我们发送的值

https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210801150945647.png

我们继续测试几次

image-20210801151033146

https://raw.githubusercontent.com/xkyvvv/blogpic/main/pic1/image-20210801151046652.png

C语言程序测试发送代码如下:

#include <Windows.h>
#include <stdio.h>HANDLE hCom;int main(void)
{hCom = CreateFile(TEXT("COM1"),//COM1口GENERIC_READ, //允许读0, //指定共享属性,由于串口不能共享,所以该参数必须为0NULL,OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL, //属性描述,该值为FILE_FLAG_OVERLAPPED,表示使用异步I/O,该参数为0,表示同步I/O操作NULL);if (hCom == INVALID_HANDLE_VALUE){printf("打开COM失败!\n");return FALSE;}else{printf("COM打开成功!\n");}SetupComm(hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小都是1024/*********************************超时设置**************************************/COMMTIMEOUTS TimeOuts;//设定读超时TimeOuts.ReadIntervalTimeout = MAXDWORD;//读间隔超时TimeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数TimeOuts.ReadTotalTimeoutConstant = 0;//读时间常量//设定写超时TimeOuts.WriteTotalTimeoutMultiplier = 1;//写时间系数TimeOuts.WriteTotalTimeoutConstant = 1;//写时间常量SetCommTimeouts(hCom, &TimeOuts); //设置超时/*****************************************配置串口***************************/DCB dcb;GetCommState(hCom, &dcb);dcb.BaudRate = 9600; //波特率为9600dcb.ByteSize = 8; //每个字节有8位dcb.Parity = NOPARITY; //无奇偶校验位dcb.StopBits = ONESTOPBIT; //一个停止位SetCommState(hCom, &dcb);DWORD wCount;//实际读取的字节数bool bReadStat;char str[2] = { 0 };while (1){int i;unsigned char sendData[256] = {0};//写入串口缓存区的数组for(i=0; i<16; i++){sendData[i] = i;}DWORD dwWriteLen = 0;if(!WriteFile(hCom, sendData, 16, &dwWriteLen, NULL)){printf("串口发送数据失败!\n");}Sleep(1000);}CloseHandle(hCom);
}

也可以使用下面这段代码

#include<stdio.h>
#include<windows.h>int main()
{FILE *fp;if ((fp = fopen("com1", "r")) == NULL){printf("cannot open com!\n");}elseprintf("open com successful!\n");char str = 'x';while (1){fprintf(fp, "%s", &str);Sleep(1000);}return 0;
}

不过不知道为什么,这两段代码都可以正常运行,但是COM2的串口调试助手那接收不到数据。
最近发现了是哪里出了问题,串口参数不一致导致的问题。
只需要将代码改成如下

#include <Windows.h>
#include <stdio.h>HANDLE hCom;int main(void)
{hCom = CreateFile(TEXT("COM1"),//COM1口GENERIC_READ | GENERIC_WRITE, //允许读和写 0, //指定共享属性,由于串口不能共享,所以该参数必须为0NULL,OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL, //属性描述,该值为FILE_FLAG_OVERLAPPED,表示使用异步I/O,该参数为0,表示同步I/O操作NULL);if (hCom == INVALID_HANDLE_VALUE){printf("打开COM失败!\n");return FALSE;}else{printf("COM打开成功!\n");}SetupComm(hCom, 1024, 1024); //输入缓冲区和输出缓冲区的大小都是1024/*********************************超时设置**************************************/COMMTIMEOUTS TimeOuts;//设定读超时TimeOuts.ReadIntervalTimeout = MAXDWORD;//读间隔超时TimeOuts.ReadTotalTimeoutMultiplier = 0;//读时间系数TimeOuts.ReadTotalTimeoutConstant = 0;//读时间常量//设定写超时TimeOuts.WriteTotalTimeoutMultiplier = 1;//写时间系数TimeOuts.WriteTotalTimeoutConstant = 1;//写时间常量SetCommTimeouts(hCom, &TimeOuts); //设置超时/*****************************************配置串口***************************/DCB dcb;GetCommState(hCom, &dcb);dcb.BaudRate = 115200; //波特率为115200dcb.ByteSize = 8; //每个字节有8位dcb.Parity = NOPARITY; //无奇偶校验位dcb.StopBits = ONESTOPBIT; //一个停止位SetCommState(hCom, &dcb);DWORD wCount;//实际读取的字节数bool bReadStat;char str[2] = { 0 };while (1){int i;unsigned char sendData[256] = {0};//写入串口缓存区的数组for(i=0; i<16; i++){sendData[i] = i;}DWORD dwWriteLen = 0;if(!WriteFile(hCom, sendData, 16, &dwWriteLen, NULL)){printf("串口发送数据失败!\n");}Sleep(1000);}CloseHandle(hCom);
}

运行之后,发现在串口2的调试助手处,显示的接收数据在增加,

在这里插入图片描述
在这里插入图片描述

但是却不会在界面上显示出来,这个不知道是啥原因。


http://www.ppmy.cn/news/774804.html

相关文章

C# 串口通讯 串口调试助手源码

工业控制类软件&#xff0c;Windows平台使用C#语言既方便又快捷。在工控领域&#xff0c;串口通讯又是极其常见的需求。于是抽时间写了一个通用的串口调试助手工具&#xff0c;并将工控调试中常用的功能集成在上面&#xff0c;方便调试。源码已在gitee上开源&#xff0c;界面使…

抖音矩阵号管理系统源码开发及布局流程

“账号矩阵”运营是一种账号运营的高阶玩法&#xff0c;指一个运营主体同时开设多个平台多个账号利用品牌联动的形式来实现账号之间的相关引流&#xff0c;以账号组的形式实现企业营销价值最大化。那么运营多个账号&#xff0c;短视频平台内容是核心&#xff0c;势必要招募多个…

每日一面系列-spring中@Autowired 和 @Resource 区别?

Autowired注解是由Spring提供的&#xff0c;它可以用来对构造方法、成员变量及方法参数进行标注&#xff0c;它能够根据对象类型完成自动注入&#xff0c;代码如下。 public class Service {// 构造方法注入 Autowired public Service(Service service) { this.s…

文本主题抽取:用gensim训练LDA模型

得知李航老师的《统计学习方法》出了第二版&#xff0c;我第一时间就买了。看了这本书的目录&#xff0c;非常高兴&#xff0c;好家伙&#xff0c;居然把主题模型都写了&#xff0c;还有pagerank。一路看到了马尔科夫蒙特卡罗方法和LDA主题模型这里&#xff0c;被打击到了&…

城市道路感受L2级智能驾驶:吉利博瑞GE深圳试驾体验

当你身处高油耗、高拥堵、路况复杂的城市空间&#xff0c;一款轻松自如、省心省油的智能座驾是每个人都渴望的。近两年&#xff0c;越来越多国产品牌实力闯入混合动力市场&#xff0c;为汽车消费者带来耳目一新的体验。 上周&#xff0c;趣味科技参加了吉利博瑞GE两款混合动力新…

智能家居 “孤岛”:群雄并起 标准混战

早上醒来&#xff0c;窗帘自动打开&#xff0c;电视为你播报今天天气&#xff0c;客厅里咖啡机也自动开启早餐模式&#xff0c;阵阵咖啡香味飘来&#xff0c;让你精神为之一振……这幅智能家居的美好图景颇为诱人。 但是&#xff0c;侯哥在使用智能家电过程中碰到了不少麻烦。 …

《炬丰科技-半导体工艺》无颗粒晶圆清洗干燥技术

书籍&#xff1a;《炬丰科技-半导体工艺》 文章&#xff1a;无颗粒晶圆清洗干燥技术 编号&#xff1a;JFKJ-21-986 作者&#xff1a;炬丰科技 引言 彻底消除半导体加工环境中所有可能的杂质对于实现亚微米至更低亚微米特征尺寸的ULSI器件非常重要。很明显&#xff0c;晶片表面…

Individual tree segmentation and tree-counting using supervised clustering

ABSTRACT 个体树木分割 (ITS) 或树木计数是精准林业和农业过程中的一项基础工作。与费时费力的人工检查不同,计算机视觉在基于无人机 (UAV) 的应用中显示出巨大的前景;此类应用之一包括森林资源清单中的自动树木计数问题。然而,由于树冠冠层的特殊性,如颜色渐变、形状不确…