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

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

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

C# 之 串口数据侦听的实现的更多相关文章

  1. 计算属性 vs 侦听属性 当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的

    https://cn.vuejs.org/v2/guide/computed.html#基础例子 计算属性 vs 侦听属性 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属 ...

  2. WCF:没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的。

    没有终结点在侦听可以接受消息的 http://xx.com/WebService.svc. 这通常是由于不正确的地址或者 SOAP 操作导致的.如果存在此情况,请参见 InnerException 以 ...

  3. Vue-计算属性和侦听属性

    复杂逻辑应使用计算属性而不应写在插值表达式{{ }}里 <div id="app"> 原值:{{ msg }} <br> 翻转后的值:{{ reverseM ...

  4. VueJs(7)---计算属性和侦听器

    计算属性和侦听器 一. 概述 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="exampl ...

  5. [转]WEB页获取串口数据

    本文转自:https://www.cnblogs.com/rockyhm/p/3434200.html 最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大 ...

  6. vue从入门到进阶:计算属性computed与侦听器watch(三)

    计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  7. Vue-比较方法、计算属性和侦听器

    分别用方法.计算属性和侦听器实现当fristName和lastName改变时,fullName跟着改变. 一.方法: html: <div id="app"> {{fu ...

  8. Vue.js之Vue计算属性、侦听器、样式绑定

    前言 上一篇介绍了Vue的基本概念,这一篇介绍一下Vue的基本使用. 一.搭建一个Vue程序 1.1 搭建Vue环境 搭建Vue的开发环境总共有三种方法: 引入CDN <script src=& ...

  9. vue计算属性和侦听器

    一.计算属性: main.js: var app = new Vue({ el: '#app', data: { math: 80, physics: 90, english: 30 }, compu ...

随机推荐

  1. Unity3D游戏开发框架-资源管理类ResourceManage

    新建文件夹:ResMgr.接着新建三个C#脚本.代码如下: IResLoadListener.cs AssetInfo.cs ResMgr.cs using UnityEngine; using Sy ...

  2. 随机函数rand()和srand()

    C++中随机函数rand()和srand()的用法 一.rand() 函数名:   rand     功   能:   随机数发生器   用   法:   int rand(void); 所在头文件: ...

  3. [MySql]GRANT权限的一些技巧

    运用 '; 可以快速创建一个用户拥有某表的SELECT操作: 运用 SHOW GRANTS FOR 'test_1'@'localhost'; 分析该用户的最终GRANT权限: MySql默认把tes ...

  4. ajax请求封装的公共方法

    /** * post 方法 */ function ajaxPost(url, params, callBack) { ajax(url,params,"post",callBac ...

  5. oracle 定时 job

    最近在工作中遇到了要在oracle里面创建一个定时job,从远程数据库里面定时把某张表里面的数据更新到本地服务器上某个表里,具体操作: 1.在自己数据库里面先创建一张表test create tabl ...

  6. FlashBack 闪回

    [学习目标] Flashback Database 功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到 过去的某个时点的状态,这个功能依赖于Flashback log日志.比RMAN 更快速 ...

  7. Confluence 6 管理协同编辑 - 代理和 SSL 的考虑

    对于你如何连接  Synchrony 是与你的环境有关的.我们知道绝大部分的 Confluence 站点是运行在反向代理后面的,同时还使用了 SSL.这里是帮助你在你环境中识别正确的配置的一些信息和一 ...

  8. Confluence 6 配置附件大小

    你可以限制上传到 Confluence 的附件的大小. 配置可以上传到 Confluence 的附件所允许的大小: 进入  > 基本配置(General Configuration). 选择 编 ...

  9. nginx官方模块之http_sub_status_module

    作用 显示nginx的连接状态,nginx客户端状态 配置语法 配置

  10. EasyUI Layout 添加、删除、折叠、展开布局

    <!DOCTYPE html> <html> <head> <title>吹泡泡的魚-主页</title> <link rel=&qu ...