VS编程,C#串口通讯,通过串口读取数据的一种方法
一、可能需要的软件:
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#串口通讯,通过串口读取数据的一种方法的更多相关文章
- 第十二节,TensorFlow读取数据的几种方法以及队列的使用
TensorFlow程序读取数据一共有3种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据. 从文件读取数据: 在TensorFlow图的起 ...
- TensorFlow读取数据的三种方法
tensortlfow数据读取有三种方式 placehold feed_dict:从内存中读取数据,占位符填充数据 queue队列:从硬盘读取数据 Dataset:同时支持内存和硬盘读取数据 plac ...
- java读取配置文件的几种方法
java读取配置文件的几种方法 原文地址:http://hbcui1984.iteye.com/blog/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配 ...
- WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。
原文:WPF编程,使用WindowChrome实现自定义窗口功能的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/arti ...
- Qt之先用了再说系列-串口通讯(单串口单线程)
QT 串口通讯(单串口单线程) 串口通讯在我们写程序的时候或多或少会用到,借此在这记录一下QT是如何使用串口来通讯的.本次先侃侃在单线程下使用1个串口来通讯过程.好了,废话不多说,直接看步骤,我们的宗 ...
- python3 Serial 串口助手的接收读取数据
其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个 ...
- python网络编程调用recv函数完整接收数据的三种方法
最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...
- C#中常用的读取xml的几种方法(转)
本文完全来源于http://blog.csdn.net/tiemufeng1122/article/details/6723764,仅作个人学习之用. XML文件是一种常用的文件格式,例如WinFor ...
- php 读取文件的几种方法
文件操作的三个步骤,打开,操作,关闭.$fopen=fopen(路径,方式),fwrite($fopen,写入的字符串);fclose($fopen). 其中打开方式有如下几种方式: 模式 描述 r ...
随机推荐
- Appium在Android7.0及以上系统运行时报错的解决方案
背景:在使用Samsung S系列手机进行自动化测试时,发现同样脚本的情况下华为荣耀系列可以正常运行,最终发现差异在于Android7.0及以上系统和appium版本不匹配,需要升级appium.但需 ...
- 常见形式 Web API 的简单分类总结
一.请求--响应API. 请求--响应类的API的典型做法是,通过基于HTTP的Web服务器暴露一个/套接口.API定义一些端点,客户端发送数据的请求到这些端点,Web服务器处理这些请求,然后返回响应 ...
- springboot~集成测试里的redis
测试不应该访问外部资源 对于单元测试,集成测试里,如果被测试的方法中使用到了redis,你需要去模拟一个单机环境的redis server,因为只有这样,你的测试才是客观的,即不会因为网络和其它因素影 ...
- 使用 ASP.NET Core MVC 创建 Web API(二)
使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...
- 个人完善的springboot拦截器
import lombok.extern.slf4j.Slf4j; import org.manage.management.permission.interceptor.LoginIntercept ...
- 深度解密HTTP通信细节
目录 HTTP报文截获 背景介绍 抓包 mac本地 远程docker 请求 && 分析 关闭服务进程 关闭docker 重启docker 正常请求 HTTP协议分析 整体介绍 编码 M ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...
- Eclipse目录实解
从左1图中可以看到,其中的src/main/java存放java文件,src/main/resources存放项目用到的资源(js,css,图片,文件等).下面的两个文件夹是用来存放测试文件和资源的( ...
- Java 原始模型(Prototype)模式
一.什么是原型模式: 通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象. 在Java语言中,支持原型模式,所有的对象都继承自Object对象,Objec ...
- 使用py2exe将python脚本转换成exe可执行文件
Python(wiki en chs)是一门弱类型解释型脚本语言,拥有动态类型系统和垃圾回收功能,支持多种编程范式:面向对象.命令式.函数式和过程式编程. 由于Python拥有一个巨大而广泛的标准库 ...