一、可能需要的软件:
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. Appium在Android7.0及以上系统运行时报错的解决方案

    背景:在使用Samsung S系列手机进行自动化测试时,发现同样脚本的情况下华为荣耀系列可以正常运行,最终发现差异在于Android7.0及以上系统和appium版本不匹配,需要升级appium.但需 ...

  2. 常见形式 Web API 的简单分类总结

    一.请求--响应API. 请求--响应类的API的典型做法是,通过基于HTTP的Web服务器暴露一个/套接口.API定义一些端点,客户端发送数据的请求到这些端点,Web服务器处理这些请求,然后返回响应 ...

  3. springboot~集成测试里的redis

    测试不应该访问外部资源 对于单元测试,集成测试里,如果被测试的方法中使用到了redis,你需要去模拟一个单机环境的redis server,因为只有这样,你的测试才是客观的,即不会因为网络和其它因素影 ...

  4. 使用 ASP.NET Core MVC 创建 Web API(二)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...

  5. 个人完善的springboot拦截器

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

  6. 深度解密HTTP通信细节

    目录 HTTP报文截获 背景介绍 抓包 mac本地 远程docker 请求 && 分析 关闭服务进程 关闭docker 重启docker 正常请求 HTTP协议分析 整体介绍 编码 M ...

  7. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...

  8. Eclipse目录实解

    从左1图中可以看到,其中的src/main/java存放java文件,src/main/resources存放项目用到的资源(js,css,图片,文件等).下面的两个文件夹是用来存放测试文件和资源的( ...

  9. Java 原始模型(Prototype)模式

    一.什么是原型模式: 通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象. 在Java语言中,支持原型模式,所有的对象都继承自Object对象,Objec ...

  10. 使用py2exe将python脚本转换成exe可执行文件

    Python(wiki en  chs)是一门弱类型解释型脚本语言,拥有动态类型系统和垃圾回收功能,支持多种编程范式:面向对象.命令式.函数式和过程式编程. 由于Python拥有一个巨大而广泛的标准库 ...