参考地址: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虚拟串口)的更多相关文章

  1. Qt串口通信接收数据不完整的解决方法

    在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...

  2. Qt串口通信接收数据不完整的解决方法(传输图片)

    在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...

  3. c# 串口发送接收数据

    /********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...

  4. Linux/windows com串口 java 接收数据 并解析 web程序

    1.首先应公司要求再 com 口本来使用 .net 由于 .net 适用 linux 太麻烦 改为java 准备工作 准备 RXTXconmm.jar(版本很重要) 因为版本问题我搞了一天. 主要讲述 ...

  5. <QT障碍之路>qt中使用串口类接收数据不完整

    问题:当用QT中的serial->readAll()的时候,不会把全部的数据一次性都读取出来,而是阶段性的.原因是因为当串口有信号时候,readyRead()信号就会被抛出,那么一帧完整的数据帧 ...

  6. STM32串口DMA接收数据错位——暴力解决方法

    背景:两片STM32通过串口通信,为了减小CPU负担,采用DMA进行通信,发送端为STM32F103C8T6,接收端为STM32F407VET6.在调试的过程中发现,一直出现数据错位的问题,接收端尝试 ...

  7. 【转】虚拟串口VSPM解决串口编程问题

    通过串口调试软件 UartAssist.exe 和虚拟串口软件 VSPM,可以解决串口编程时没用硬件调试的问题,通过VSPM虚拟出串口设备,让程序发送信息到 VSPM 设备后通过 UartAssist ...

  8. STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  9. C#串口编程测试收发

    原文:http://www.cnblogs.com/vsdot/archive/2013/04/23/3263348.html   基本传递方法:RS232传输要有1位起始位,8位数据位.1位校验位( ...

随机推荐

  1. python测试开发django-72.删除表后如何重新生成表

    前言 在使用ORM建表的时候,由于需要对数据库表的重新设计,需要删除原表,并通过Django的ORM功能重新同步表. 删除表之后,发现用 makemigrations 和 migrate 无法生成新的 ...

  2. cordova 一个将web应用程序封装成app的框架

    cordova的详细介绍请参考这个链接:http://www.zhoujingen.cn/blog/7034.html 我接下来主要将如何搭建. 1.首先你需要下载几样东西 1.jdk. 2.andr ...

  3. 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 ...

  4. 201871010101-陈来弟《面向对象程序设计(java)》第二周学习总结

    201871010101-陈来弟<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs ...

  5. LuoguP5540:【模板】最小乘积生成树(几何逼近)

    题意:给定N点,M边,每条边有两个属性(a,b),现在让你选N-1条边出来,然后使得∑a*∑b最小.N<200,M<1e4: 思路:我们把∑a看成x,∑b看成y,那么一个方案对应一个二维坐 ...

  6. python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property

    组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...

  7. C# 委托的本质

    它本质是一个方法的容器 委托 只是 一件衣服, 在所有将委托做参数的地方 ,首先想到的是放一个对应的方法进来.

  8. 图的遍历 | 1034 map处理输入数据,连通块判断

    这题写得比较痛苦.首先有点不在状态,其次题目比较难读懂. “Gang”成立的两个条件:①成员数大于两个  ②边权总和大于阈值K 首先,在录数据的时候通过map或者字符串哈希建立string到int的映 ...

  9. 何为pc值

    PC就是程序计数器,就是指挥程序从哪里执行.如果是8位机,每个存储单元存放一个字节,指令有单字节.双字节和3字节.单片机复位时,PC=0000H,而后每执行一条指令,PC根据指令的字节数增加,如图:最 ...

  10. 经典算法(六) simhash

    参考文档: simhash算法原理及实现:https://blog.csdn.net/chenguolinblog/article/details/50830948