一、可能需要的软件:
1、虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯。

2、友善串口调试助手,用来发送、读取数据。

二、思路
1、查询本机所有的串口

2、判断需要的串口是否存在本机的串口中

3、设置串口的参数,如波特率、奇偶校验等。

4、打开串口,

5、通过串口读取数据,处理数据

6、关闭当前窗口时,将串口一并关闭。

7、可以写一个定时器,来循环执行1、2两步,并判断串口是否打开,以保持串口通讯正常。

三,代码

1、查询本机所有的串口

 /// <summary>
/// 获取本机串口列表
/// </summary>
/// <param name="isUseReg"></param>
/// <returns></returns>
private List<string> GetComlist(bool isUseReg)
{
List<string> list = new List<string>();
try
{
if (isUseReg)
{
RegistryKey RootKey = Registry.LocalMachine;
RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM"); String[] ComNames = Comkey.GetValueNames(); foreach (String ComNamekey in ComNames)
{
string TemS = Comkey.GetValue(ComNamekey).ToString();
list.Add(TemS);
}
}
else
{
foreach (string com in SerialPort.GetPortNames()) //自动获取串行口名称
list.Add(com);
}
}
catch
{
MessageBox.Show("串行端口检查异常!", "提示信息");
// System.Environment.Exit(0); //彻底退出应用程序
}
return list;
}

2、判断需要的串口是否存在本机的串口中

/// <summary>
/// 判断是否存在当前串口
/// </summary>
private void StartSerialPortMonitor()
{
List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表
if (comList.Count == )
{
MessageBox.Show("当前设备不存在串行端口!", "提示信息");
// System.Environment.Exit(0); //彻底退出应用程序
}
else
{
string targetCOMPort = "COM8";
//判断串口列表中是否存在目标串行端口
if (!comList.Contains(targetCOMPort))
{
MessageBox.Show("提示信息", "当前设备不存在配置的串行端口!");
//System.Environment.Exit(0); //彻底退出应用程序
}
}
}

3、设置串口的参数,如波特率、奇偶校验等。

首先定义字段:

private SerialPort serialPort;

/// <summary>
/// 设置通讯串口
/// </summary>
public void setcom()
{
try
{
StartSerialPortMonitor();
serialPort.PortName = "COM8"; //通信端口
serialPort.BaudRate = ; //串行波特率
serialPort.DataBits = ; //每个字节的标准数据位长度
serialPort.StopBits = StopBits.Two; //设置每个字节的标准停止位数
serialPort.Parity = Parity.None; //设置奇偶校验检查协议
//下面这句是当信息中有汉字时,能正确传输,不然会出现问号。
serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");
//串口控件成员变量,字面意思为接收字节阀值,
//串口对象在收到这样长度的数据之后会触发事件处理函数
//一般都设为1
serialPort.ReceivedBytesThreshold = ;
serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听) serialPort.Open(); //打开串口
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} }

4、打开串口,

5、通过串口读取数据,处理数据

/// <summary>
/// 通讯有数据进执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
{
getcom();
}
public void getcom()
{
try
{
//定义一个字段,来保存串口传来的信息。
string str = ""; int len = serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
serialPort.Read(readBuffer, , len);
str = Encoding.Default.GetString(readBuffer); //如果需要和界面上的控件交互显示数据,使用下面的方法。其中ttt是控件的名称。
//this.tttt.Dispatcher.Invoke(new Action(() =>
//{
// tttt.Text = str ;
//})); serialPort.DiscardInBuffer(); //清空接收缓冲区
}
catch (Exception ex)
{
serialPort.Close();
MessageBox.Show(ex.Message);
}
}

6、关闭当前窗口时,将串口一并关闭

private void MainWindow1_Closed(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
serialPort.Close();
}
}

7、可以写一个定时器,来循环执行1、2两步,保持串口通讯正常。

如果电脑不存在串口,提示警告

如果目标串口不在电脑的串口列表里,提示警告,

如果目标串口当前是关闭的状态,将其打开。

如果串口已经打开,再次打开会报错,无法正常工作。一定要注意。
if (!serialPort.IsOpen)
{
serialPort.Open();
}

VS编程,C#串口通讯,通过串口读取数据的一种方法的更多相关文章

  1. 第十二节,TensorFlow读取数据的几种方法以及队列的使用

    TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow图的起 ...

  2. TensorFlow读取数据的三种方法

    tensortlfow数据读取有三种方式 placehold feed_dict:从内存中读取数据,占位符填充数据 queue队列:从硬盘读取数据 Dataset:同时支持内存和硬盘读取数据 plac ...

  3. java读取配置文件的几种方法

    java读取配置文件的几种方法 原文地址:http://hbcui1984.iteye.com/blog/56496         在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配 ...

  4. WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。

    原文:WPF编程,使用WindowChrome实现自定义窗口功能的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/arti ...

  5. Qt之先用了再说系列-串口通讯(单串口单线程)

    QT 串口通讯(单串口单线程) 串口通讯在我们写程序的时候或多或少会用到,借此在这记录一下QT是如何使用串口来通讯的.本次先侃侃在单线程下使用1个串口来通讯过程.好了,废话不多说,直接看步骤,我们的宗 ...

  6. python3 Serial 串口助手的接收读取数据

    其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个 ...

  7. python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...

  8. C#中常用的读取xml的几种方法(转)

    本文完全来源于http://blog.csdn.net/tiemufeng1122/article/details/6723764,仅作个人学习之用. XML文件是一种常用的文件格式,例如WinFor ...

  9. php 读取文件的几种方法

    文件操作的三个步骤,打开,操作,关闭.$fopen=fopen(路径,方式),fwrite($fopen,写入的字符串);fclose($fopen). 其中打开方式有如下几种方式: 模式 描述 r ...

随机推荐

  1. 三种方式实现观察者模式 及 Spring中的事件编程模型

    观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧, ...

  2. Docker 上传镜像

    文章首发自个人网站:https://www.exception.site/docker/docker-push-image 本文中,您将学习如何上传 Docker 镜像至 Docker Hub 上. ...

  3. 源码安装Nginx加TCP反向代理模块

    说明: 安装方式是源码编译安装,因此先安装相关依赖,否则报错. yum -y install gcc* patch openssl openssl-devel 安装步骤: 下载nginx源码包: wg ...

  4. Python爬虫入门教程 45-100 Charles抓取兔儿故事-下载小猪佩奇故事-手机APP爬虫部分

    1. Charles抓取兔儿故事背景介绍 之前已经安装了Charles,接下来我将用两篇博客简单写一下关于Charles的使用,今天抓取一下兔儿故事里面关于小猪佩奇的故事. 爬虫编写起来核心的重点是分 ...

  5. chrome 错误 ERR_CACHE_READ_FAILURE

    问题现象 谷歌浏览器,点击后退按键提示:ERR_CACHE_READ_FAILURE 错误 解决办法 1. chrome://flags/#enable-simple-cache-backend 2. ...

  6. 个人完善的springboot拦截器

    import lombok.extern.slf4j.Slf4j; import org.manage.management.permission.interceptor.LoginIntercept ...

  7. Golang 语言的单元测试和性能测试(也叫 压力测试)

    Golang单元测试对文件名和方法名,参数都有很严格的要求. 例如: 1.文件名必须以xx_test.go命名 2.方法必须是Test[^a-z]开头(T必须大写),func TestXxx (t * ...

  8. leetcode 链表类型题目解题总结

    最基础的方式要做到非常熟练,要熟练到不思考就能写,但又需明白各处的要求和陷阱 合并两个有序链表的操作,在前面加上一个初始节点,注意while循环和退出时的处理,理解如何处理其中一个链表遍历完的情况 L ...

  9. ado.net的简单数据库操作(三)——简单增删改查的实际应用

    果然,在犯困的时候就该写写博客,写博客就不困了,哈哈! 上篇我记录了自己的SqlHelper的开发过程,今天记录一下如何使用这个sqlhelper书写一个具有简单增删改查的小实例啦. 实例描述:在数据 ...

  10. DSAPI实现简单的透明窗体

    代码 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim B As New Bitmap( ...