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位校验位( ...
随机推荐
- python测试开发django-72.删除表后如何重新生成表
前言 在使用ORM建表的时候,由于需要对数据库表的重新设计,需要删除原表,并通过Django的ORM功能重新同步表. 删除表之后,发现用 makemigrations 和 migrate 无法生成新的 ...
- cordova 一个将web应用程序封装成app的框架
cordova的详细介绍请参考这个链接:http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建. 1.首先你需要下载几样东西 1.jdk. 2.andr ...
- java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES) at com.mysql.c ...
- 201871010101-陈来弟《面向对象程序设计(java)》第二周学习总结
201871010101-陈来弟<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs ...
- LuoguP5540:【模板】最小乘积生成树(几何逼近)
题意:给定N点,M边,每条边有两个属性(a,b),现在让你选N-1条边出来,然后使得∑a*∑b最小.N<200,M<1e4: 思路:我们把∑a看成x,∑b看成y,那么一个方案对应一个二维坐 ...
- python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property
组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...
- C# 委托的本质
它本质是一个方法的容器 委托 只是 一件衣服, 在所有将委托做参数的地方 ,首先想到的是放一个对应的方法进来.
- 图的遍历 | 1034 map处理输入数据,连通块判断
这题写得比较痛苦.首先有点不在状态,其次题目比较难读懂. “Gang”成立的两个条件:①成员数大于两个 ②边权总和大于阈值K 首先,在录数据的时候通过map或者字符串哈希建立string到int的映 ...
- 何为pc值
PC就是程序计数器,就是指挥程序从哪里执行.如果是8位机,每个存储单元存放一个字节,指令有单字节.双字节和3字节.单片机复位时,PC=0000H,而后每执行一条指令,PC根据指令的字节数增加,如图:最 ...
- 经典算法(六) simhash
参考文档: simhash算法原理及实现:https://blog.csdn.net/chenguolinblog/article/details/50830948