一、可能需要的软件:
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. Identity Server 4 - Hybrid Flow - 保护API资源

    这个系列文章介绍的是Identity Server 4 的 Hybrid Flow, 前两篇文章介绍了如何保护MVC客户端, 本文介绍如何保护API资源. 保护MVC客户端的文章: https://w ...

  2. 《HelloGitHub》第 30 期

    公告 截止到第 30 期,贡献者 终于到达 3 位数-- 100 位.谢谢各位的支持和贡献,想要加入的小伙伴,快来推荐项目吧! <HelloGitHub>第 30 期 兴趣是最好的老师,H ...

  3. springboot~mockMvc和asciidoctor生成基于TDD的API文档

    API文档是前端与后端快速开发,减少沟通成本的必要条件,有一份完善的文档是很必要的,由通过测试来生成文档的好处就是:测试数据有了,测试返回结果有了,而且可以对这些字段进行说明,很清晰,在springb ...

  4. Python编程从入门到实践笔记——if语句

    Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...

  5. 以太坊工作原理之txpool详解

    txpool详解 交易池txpool作为区块链系统的重要组成部分,对系统的安全性和稳定性具有重要作用.功能可归纳为:交易缓存.交易验证和交易过滤. 基本介绍 交易分类和缓存 txpool主要包含两个重 ...

  6. HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

    传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...

  7. InnoSetup 脚本打包及管理员权限设置

    InnoSetup使用教程:InnoSetup打包安装 脚本详细 1. 定义变量 #define MyAppName "TranslationTool" #define MyApp ...

  8. [TCP/IP] 传输层-TCP和UDP的使用场景

    传输层-TCP和UDP应用场景 TCP(传输控制协议) 需要将要传输的文件分段传输,建立会话,可靠传输,流量控制 UDP(用户报文协议) 一个数据包就能完成数据通信,不需要建立会话,不分段,不用流量控 ...

  9. px妙转rem

    px:像素,相对长度单位,相对于显示器屏幕的分辨率而言(其实我个人认为可以理解为固定单位): rem:这是个web前端中的新成员,是CSS3中新增的一个相对单位.相对的只是html根元素: 1.设定两 ...

  10. 高通平台如何避免误入FFBM模式

    前面两篇博客分别介绍了通过fastboot和QFIL工具退出FFBM模式的方法.虽然售后的同学可以这么指导用户做恢复,但步骤多操作也麻烦,且属于事后处理,如果大面积高概率地出现,会严重影响用户体验.这 ...