博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 之 串口数据侦听的实现
阅读量:7080 次
发布时间:2019-06-28

本文共 4258 字,大约阅读时间需要 14 分钟。

  当需要编程操纵硬件时会遇到过这样的问题,就是通过串口来接收硬件发来的数据,或是通过串口向硬件发送某种格式的命令。在C#平台上,可以通过 System.IO.Ports 命名空间下的SerialPort 类来实现。

  下面是我做过的一个简单的示例,首先获取本机关联的串行端口列表,然后获取配置文件中配置的COM端口,检查是否在本机串行端口列表中,若在列表中则进一步实例化串口对象,并为串口对象指定数据接收事件来实现监听,示例代码如下:

 

using System.IO.Ports;namespace SerialTest{  public class SerialTest  {       #region 串口监听            private SerialPort serialPort = null;        ///         /// 开启串口监听        ///         private void StartSerialPortMonitor()        {            List
comList = GetComlist(false); //首先获取本机关联的串行端口列表        if (comList.Count == 0) { DialogForm.Show("提示信息", "当前设备不存在串行端口!"); System.Environment.Exit(0); //彻底退出应用程序    } else { string targetCOMPort = ConfigurationManager.AppSettings["COMPort"].ToString(); //判断串口列表中是否存在目标串行端口 if (!comList.Contains(targetCOMPort)) { DialogForm.Show("提示信息", "当前设备不存在配置的串行端口!"); System.Environment.Exit(0); //彻底退出应用程序    } serialPort = new SerialPort(); //设置参数 serialPort.PortName = ConfigurationManager.AppSettings["COMPort"].ToString(); //通信端口 serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings["BaudRate"].ToString()); //串行波特率 serialPort.DataBits = 8; //每个字节的标准数据位长度 serialPort.StopBits = StopBits.One; //设置每个字节的标准停止位数 serialPort.Parity = Parity.None; //设置奇偶校验检查协议 serialPort.ReadTimeout = 3000; //单位毫秒 serialPort.WriteTimeout = 3000; //单位毫秒 //串口控件成员变量,字面意思为接收字节阀值, //串口对象在收到这样长度的数据之后会触发事件处理函数 //一般都设为1 serialPort.ReceivedBytesThreshold = 1; serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听) try { serialPort.Open(); //打开串口 } catch (Exception ex) { DialogForm.Show("提示信息", "串行端口打开失败!具体原因:" + ex.Message); System.Environment.Exit(0); //彻底退出应用程序    } } } ///
/// 串口数据处理函数 /// ///
///
public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e) { try { //Comm.BytesToRead中为要读入的字节长度 int len = serialPort.BytesToRead; Byte[] readBuffer = new Byte[len]; serialPort.Read(readBuffer, 0, len); //将数据读入缓存 //处理readBuffer中的数据,自定义处理过程 string msg = encoding.GetString(readBuffer, 0, len); //获取出入库产品编号 DialogForm.Show("接收到的信息", msg); } catch(Exception ex) { DialogForm.Show("提示信息", "接收返回消息异常!具体原因:" + ex.Message); } } ///
/// 关闭串口 /// private void Stop() { serialPort.Close(); } ///
/// 获取本机串口列表 /// ///
///
private List
GetComlist(bool isUseReg) { List
list = new List
(); 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 { DialogForm.Show("提示信息", "串行端口检查异常!"); System.Environment.Exit(0); //彻底退出应用程序    } return list; }   #endregion 串口监听 }}

 

转载地址:http://stpml.baihongyu.com/

你可能感兴趣的文章
SilverLight控件之ContextMenu和RadContextMenu(菜单)
查看>>
css3背景颜色渐变属性 兼容性测试基础环境为:windows系统;IE6.0+, Firefox4.0+, Chrome4.0+, Safari4.0+, Opera15.0+...
查看>>
word怎么删除空白页
查看>>
2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建
查看>>
探索SpringBoot中的SpringMVC
查看>>
memcpy的用法总结
查看>>
HDU 4027 Can you answer these queries?
查看>>
jq购物车结算功能
查看>>
leetcode725
查看>>
Android WebRTC 音视频开发总结(三)-- 信令服务和媒体服务
查看>>
EntityFramework IEnumerable,IQueryable ,Include
查看>>
memtrack: Couldn't load memtrack module (No such file or directory) 的问题解决
查看>>
Visio画图(一):UML用例图
查看>>
Docker入门(五):Swarms
查看>>
盘点:#AzureChat - 虚拟机和自动伸缩
查看>>
【PHP设计模式 04_GongChang.php】 工厂方法
查看>>
架构阅读笔记8
查看>>
awk
查看>>
FCC学习笔记(三)
查看>>
mysql丢数据
查看>>