Winform串口编程---接收数据demo(VSPD虚拟串口)
参考地址:https://blog.csdn.net/memgxingfeixiang/article/details/52513970
https://blog.csdn.net/kevin_iot/article/details/53926599
一、需求概述
应用场景:winform中能接收到串口发送的数据。
所需软件: Configure Virtual Serial Port Driver(虚拟串口模拟软件)、串口调试助手。
二、效果展示(很简陋,捂脸中......)

说明:cmbPort是电脑上所有串口的列表,txtReciveData是每次该串口接收的数据,btnOpenOrClose按钮是控制打开/关闭串口。
三、具体实现:
(1)先在Load事件里将comPort控件绑定电脑串口列表,代码如下:
#region 初始化电脑上的串口列表
foreach (string sPort in SerialPort.GetPortNames())
{
cmbPort.Items.Add(sPort);
} //串口设置默认选项
if (cmbPort.Items.Count>)
{
cmbPort.SelectedIndex = ;
}
#endregion
(2)编写btnOpenOrClose点击事件
/// <summary>
/// 打开/关闭串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenOrClose_Click(object sender, EventArgs e)
{
try
{
if (btnOpenOrClose.Text == "打开串口")
{
btnOpenOrClose.Text = "关闭串口";
//设置串口的基本属性
serialPort.PortName = cmbPort.SelectedItem.ToString();
serialPort.BaudRate = ;
serialPort.Parity = Parity.None;
serialPort.DataBits = ;
serialPort.StopBits = StopBits.One;
serialPort.Open();
}
else
{
btnOpenOrClose.Text = "打开串口";
serialPort.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
(3)编写接收串口数据方法
void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
Byte[] InputBuf = new Byte[];
serialPort.Read(InputBuf, , serialPort.BytesToRead); ASCIIEncoding encoding = new ASCIIEncoding();
data = encoding.GetString(InputBuf);
new Thread(SetReceiveData).Start();
//直接调用会报错-------从不是创建控件”txtContent”的线程访问它
//SetReceiveData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
接收数据成功,调用下面的方法,将发送的数据显示到文本框中。
/// <summary>
/// (将接收的数据显示到文本框中)不懂这一块的实现逻辑,需要加深理解线程的相关概念
/// </summary>
public void SetReceiveData()
{
lock (this) Invoke(new MethodInvoker(delegate () { this.txtReciveData.Text = data; })); }
在load事件中将订阅该事件
//为串口加上数据接收事件
serialPort.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
四:模拟串口发送数据
(1)打开vspd软件,虚拟出两个COM1和COM2两个串口

(2)打开串口调试助手,一个是COM1,另外一个是COM2,将两个串口的波特率设置为一样。

测试一下,两个串口是否能正常通讯。

(3)关掉其中的一个串口调试助手,留下COM2的串口调试助手,我们在程序中用COM1口接收数据。(winform中要先点击“打开串口”按钮)

五、完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading; namespace ComDataTest
{
public partial class ComData : Form
{
private SerialPort serialPort=new SerialPort();
string data = string.Empty;
public ComData()
{
InitializeComponent();
} private void ComData_Load(object sender, EventArgs e)
{
#region 初始化电脑上的串口列表
foreach (string sPort in SerialPort.GetPortNames())
{
cmbPort.Items.Add(sPort);
} //串口设置默认选项
if (cmbPort.Items.Count>)
{
cmbPort.SelectedIndex = ;
}
#endregion //为串口加上数据接收事件
serialPort.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
} /// <summary>
/// 打开/关闭串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpenOrClose_Click(object sender, EventArgs e)
{
try
{
if (btnOpenOrClose.Text == "打开串口")
{
btnOpenOrClose.Text = "关闭串口";
//设置串口的基本属性
serialPort.PortName = cmbPort.SelectedItem.ToString();
serialPort.BaudRate = ;
serialPort.Parity = Parity.None;
serialPort.DataBits = ;
serialPort.StopBits = StopBits.One;
serialPort.Open();
}
else
{
btnOpenOrClose.Text = "打开串口";
serialPort.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
} /// <summary>
/// (将接收的数据显示到文本框中)不懂这一块的实现逻辑,需要加深理解线程的相关概念
/// </summary>
public void SetReceiveData()
{
lock (this) Invoke(new MethodInvoker(delegate () { this.txtReciveData.Text = data; })); } void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
Byte[] InputBuf = new Byte[];
serialPort.Read(InputBuf, , serialPort.BytesToRead); ASCIIEncoding encoding = new ASCIIEncoding();
data = encoding.GetString(InputBuf);
new Thread(SetReceiveData).Start();
//直接调用会报错-------从不是创建控件”txtContent”的线程访问它
//SetReceiveData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
}
六、写在后面的话:
初次接触串口编程,作为码农多年,确实有些汗颜。从最初下载vspd和串口调试软件,根本不知如何用,到慢慢的了解一些,会简单的一些操作,着实也费了一点时间。目前对于串口编程,还是有一些云里雾里,似乎缺少一根主线把他们串起来一般,还是需要再进行摸索和探究,继续加油~
Winform串口编程---接收数据demo(VSPD虚拟串口)的更多相关文章
- Qt串口通信接收数据不完整的解决方法
在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...
- Qt串口通信接收数据不完整的解决方法(传输图片)
在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...
- Linux/windows com串口 java 接收数据 并解析 web程序
1.首先应公司要求再 com 口本来使用 .net 由于 .net 适用 linux 太麻烦 改为java 准备工作 准备 RXTXconmm.jar(版本很重要) 因为版本问题我搞了一天. 主要讲述 ...
- <QT障碍之路>qt中使用串口类接收数据不完整
问题:当用QT中的serial->readAll()的时候,不会把全部的数据一次性都读取出来,而是阶段性的.原因是因为当串口有信号时候,readyRead()信号就会被抛出,那么一帧完整的数据帧 ...
- STM32串口DMA接收数据错位——暴力解决方法
背景:两片STM32通过串口通信,为了减小CPU负担,采用DMA进行通信,发送端为STM32F103C8T6,接收端为STM32F407VET6.在调试的过程中发现,一直出现数据错位的问题,接收端尝试 ...
- 【转】虚拟串口VSPM解决串口编程问题
通过串口调试软件 UartAssist.exe 和虚拟串口软件 VSPM,可以解决串口编程时没用硬件调试的问题,通过VSPM虚拟出串口设备,让程序发送信息到 VSPM 设备后通过 UartAssist ...
- STM32之串口DMA接收不定长数据
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...
- C#串口编程测试收发
原文:http://www.cnblogs.com/vsdot/archive/2013/04/23/3263348.html 基本传递方法:RS232传输要有1位起始位,8位数据位.1位校验位( ...
随机推荐
- <code> 标签 让一段计算机代码显示在网页中
<code> 标签 解释:要让一段计算机代码显示在网页中,那么这段代码需要用<code> 标签包起来,不然他会被当作网页的代码被 运行. 例如: <code>< ...
- 编译3516cv500 osdrv失败解决
configure: WARNING: cannot find uuid library required for mkfs.ubifsconfigure: mtd-utils can optiona ...
- MYSQL免安装操作方法
http://blog.csdn.net/brokge/article/details/17356765 注意:win 7 win10 下载的权限问题
- centos安装安全狗5步就能完成
安全狗是为服务器开发的一款服务器管理软件,客户的服务器是centos 64位,我们就来看看如何安装吧.首先必须得有root账号权限,不然下面的步骤可能都无法执行.随ytkah一起来操作吧 1.下载安全 ...
- dedecms去掉标题长度限制
dedecms文章标题默认显示字数为60字节(30个汉字),如果想要显示更多要如何操作呢?两步解决问题,随ytkah一起来看看吧.1.后台找到“系统设置-系统基本参数-其他其他选项”(如下图)这时你可 ...
- 解决tomcat出现乱码问题---韦大仙
1. 改这两个文件 URIEncoding="UTF-8" 2.然后重启idea
- 第二阶段冲刺(个人)——three
今天的个人计划:选择功能界面的选择框排版设计.使得一些选择功能当点击鼠标事件后才会出现. 昨天做了什么?测试登录功能并优化. 遇到了什么困难?一些js函数的运用不熟悉,好多借助了百度.
- docker删除镜像Error response from daemon: conflict: unable to remove repository reference
Docker无法删除images,由于是依赖container. 1.进入root权限 sudo su 2. 列出所有运行或没有运行的镜像 docker ps -a 3.停止containe ...
- html--前端javascript初识
一.JavaScript简介 JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动.使用它的目的是与HTML超文本标识语言.Java 脚本语 ...
- monkey--介绍
前戏 monkey程序是android系统自带的,其启动脚本是位于android系统的/system/bin目录的monkey文件,其jar包是位于android系统的/system/framewor ...