.NET串口通讯解决方案

网上关于.NET串口通讯的文章不少,但大多只是一些对.NET串口通讯函数的简单封装,对于实际的操作和使用,并没有太直接的帮助。本人做过几个.NET下串口通讯的小项目,借鉴了一些前人的经验(特别是SharpGps)并结合自己的一些心得和体会,写下这篇文章,算是对自己这部分工作的一个总结。

本来这篇文章的题目叫“.NET串口通讯设计”,想想觉得如果叫这个名字,那就没有写下去的必要了(网上这样的文章大把)。至于这篇文章配得上“解决方案”这四个字否? (我也不知道~) 言归正传,正文开始…

  • 设计概要

      SerialPort.cs

      ComEvent.cs

      Enumerations.cs

      以及各种协议的具体实现类,如XXX_imp.cs

  • 通讯基础类SerialPort.cs

      主要封装一些.Net串口通讯已实现的一些常用方法,这个类和网上大多数介绍.Net串口通讯的文章所介绍的差不多,唯一不同的地方是在接收部分的处理(注:接收部分采用了异步的方式),利用了.Net的事件机制,将“接收数据”这一事件根据事件类型(即协议),告知给协议的具体实现类进行相应的处理。

public class SerialPort : IDisposable
    {
        private System.IO.Ports.SerialPort com;
        private bool disposed = false;

        internal event RevMsgDelegate MsgDelegate;

        public SerialPort()
        {
            com = new System.IO.Ports.SerialPort();
            //默认参数
           com.PortName = "com1";
            com.BaudRate = 9600;
            com.DataBits = 8;
            com.StopBits = StopBits.One;
            com.Parity = Parity.None;

            com.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            disposed = false;
        }

        public void Dispose()
        {
            if (!this.disposed)
            {
                this.Stop();
                com = null;
            }
            disposed = true;

            GC.SuppressFinalize(this);
        }

        ~SerialPort()
        {
            Dispose();
        }
        /// <summary>
        /// 数据接受响应函数
       /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(500);
            System.IO.Ports.SerialPort sp = (System.IO.Ports.SerialPort)sender;
            String indata = sp.ReadExisting();
                     
            //接受数据消息 将接受到的数据分类 然后转发给响应的imp
            if (MsgDelegate != null)
            {
                RevMsgEventArgs RevEventArgs = new RevMsgEventArgs();
                RevEventArgs.MsgType = GetCommType(indata);
                MsgDelegate(indata, RevEventArgs);
            }
        }

        /// <summary>
        /// 反馈数据类型识别
         /// </summary>
        /// <param name="sentence"></param>
        /// <returns></returns>
        private GTCommType GetCommType(string sentence)
        { 
//具体根据协议,进行类别的判断       
//...... 
           return commType;
        }

        public bool Write(String cmd)
        {
            try
            {
                com.Write(cmd);
            }
            catch (System.Exception e)
            {
                return false;
            }
            return true;
        }

        public bool Open()
        {
            try
            {
                com.Open();
            }
            catch (System.IO.IOException ex)
            {
                return false;
            }
            return true;
        }

        public bool IsPortOpen
        {
            get { return com.IsOpen; }
        }

        public void Stop()
        {
            if (com != null)
                if (com.IsOpen)
                    com.Close();
        }

        public String PortName
        {
            get { return com.PortName; }
            set
            {
                if (value != null)
                    com.PortName = value;
            }
        }
        public int BaudRate
        {
            get { return com.BaudRate; }
            set
            {
                if (value != 0)
                    com.BaudRate = value;
            }
        }
        public int DataBits
        {
            get { return com.DataBits; }
            set
            {
                if (value != 0)
                    com.DataBits = value;
            }
        }
        public StopBits Stopbits
        {
            get { return com.StopBits; }
            set
            {
                if (value != 0)
                    com.StopBits = value;
            }
        }
        public Parity parity
        {
            get { return com.Parity; }
            set
            {
                if (value != 0)
                    com.Parity = value;
            }
        }
    }
  • ComEvent.cs

      定义代理(事件的载体)以及事件的内容,主要包含两个代理:(1)接收数据代理RevMsgDelegate, 用来将DataReceivedHandler中接收到数据分发给相应的imp  (2)UI代理UIMsgDelegate, 用来将imp类中处理好的数据发送给UI以实现相应的逻辑,例如数据的呈现等界面操作。 注: 如果通讯是在线程中处理的,那么UI的响应需要调用Invoke方法实现。

//接收数据代理
internal delegate void RevMsgDelegate(object sender, RevMsgEventArgs e);
internal class RevMsgEventArgs : EventArgs   //接受数据事件内容
{
    public GTCommType MsgType;//接受到的数据类型
}
//UI事件代理
public delegate void UIMsgDelegate(object sender, UIMsgEventArgs e);
public class UIMsgEventArgs : EventArgs
{
    //UI事件内容
    //...... 
}
  • Enumerations.cs

      事件类型的枚举。

public enum CommMsgType
 {
     //通讯事件
     //......
 }

 public enum UIMsgType
 {      
     //UI事件
     //......
 }
  • 协议的具体实现类

      主要的功能是接收RevMsgDelegate代理发送过来的事件,根据当前协议的内容,对数据进行解析并通过UIMsgDelegate发送相应的界面事件,驱动相关联的界面操作。本类主要是根据实际情况进行封装,所以在此不多说,只列出一些重要的操作。

public class XXX_imp
    {
        private SerialPort _port;
        //UI事件
         public event UIMsgDelegate UIMsg;
        UIMsgEventArgs UIEventArgs;

        public XXX_imp(SerialPort port)
        {
            _port = port;
            //绑定数据接受事件
            port.MsgDelegate += new RevMsgDelegate(Parse);
        }

        private void Parse(object sender, RevMsgEventArgs e)
        {
            if (e.MsgType == GTCommType.XXX)
            {
            //解析数据
              //...... 
            }
        }#region 接口
        //根据需要的业务逻辑编写有关方法
        //......
        #endregion
    }

 

      到此本文就告一段落, 本人是.Net的初学者,只是略懂皮毛,写这篇文章更主要的目的还是希望大家能多多指点,有不足和改进的地方希望能予以指出。

转载于:https://www.cnblogs.com/DeafeningZhao/archive/2012/10/30/2723914.html

书名:《Visual C#.NET串口通信及测控应用典型实例》(电子工业出版社.李江全.邓红涛.刘巧.李伟) PDF格式扫描版,全书分为8章,共369页。2012年5月出版。 全书压缩打包成3部分,这是第1部分 内容简介 本书从工程应用的角度出发,通过8个典型应用实例,包括PC与PC、PC与单片机、PC与PLC、PC与远程I/O模块、PC与智能仪器、PC与无线数传模块、Pc与USB数据采集模块等组成的测控系统,利用SerialPort控件和MSComm控件编写C#.NET串口通信程序,并对计算机测控系统中的4类典型应用((模拟量输入(AI)、模拟量输出(AO)、数字量输入(DI)和数字量输出(DO)的程序设计方法进行了详细的讲解。 目 录 第1章 PC与PC串口通信 1.1 串口通信概述 1.1.1 串口通信的基本概念 1.1.2 RS-232C接口标准 1.1.3 RS-422/485接口标准 1.1.4 串口通信线路连接 1.1.5 PC中的串行端口 1.1.6 虚拟串口的使用 1.2 VC++.NET串行通信控件与API函数 1.2.1 MSComm控件的使用 1.2.2 SerialPort控件的使用 1.2.3 串行通信API函数 1.3 PC与PC串口通信实例 1.3.1 两台PC串口通信 1.3.2 一台PC双串口互通信 第2章 PC与单片机串口通信 2.1 典型单片机开发板简介 2.1.1 单片机测控系统的组成 2.1.2 单片机开发板B的功能 2.1.3 单片机开发板B的主要电路 2.2 PC与单片机串口通信实例 2.2.1 PC与单个单片机串口通信 2.2.2 PC与多个单片机串口通信 2.3 PC与单片机串口通信测控应用实例 2.3.1 模拟量输入 2.3.2 模拟量输出 2.3.3 开关量输入 2.3.4 开关量输出 第3章 PC与西门子PLC串口通信 3.1 西门子PLC模拟量扩展模块与通信协议 3.1.1 西门子PLC模拟量输入模块 3.1.2 西门子PLC PPI通信协议 3.2 PC与西门子PLC串口通信测控应用实例 3.2.1 模拟量输入 3.2.2 模拟量输出 3.2.3 开关量输入 3.2.4 开关量输出 第4章 PC与三菱PLC串口通信 4.1 三菱PLC特殊功能模块与通信协议 4.1.1 FX2N系列PLC的特殊功能模块 4.1.2 三菱PLC编程口通信协议 4.2 PC与三菱PLC串口通信测控应用实例 4.2.1 模拟量输入 4.2.2 模拟量输出 4.2.3 开关量输入 4.2.4 开关量输出 第5章 PC与分布式I/O模块串口通信 5.1 典型分布式I/O模块简介 5.1.1 集散控制系统的结构与特点 5.1.2 ADAM4000远程数据采集控制系统 5.1.3 ADAM4000系列模块简介 5.1.4 ADAM4000系列模块的软件安装 5.2 PC与分布式I/O模块串口通信测控应用实例 5.2.1 模拟量输入 5.2.2 模拟量输出 5.2.3 数字量输入 5.2.4 数字量输出 第6章 PC与智能仪器串口通信 6.1 典型智能仪器简介 6.1.1 智能仪器的结构与特点 6.1.2 XMT-3000A型智能仪器的通信协议 6.2 PC与智能仪器串口通信测控应用实例 6.2.1 PC与单台智能仪器温度测控 6.2.2 PC与多台智能仪器温度测控 第7章 PC与无线数据传输模块串口通信 7.1 典型无线数传模块简介 7.1.1 无线数传技术概述 7.1.2 DTD46X系列无线数传模块 7.2 PC与无线数传模块串口通信测控应用实例 7.2.1 设计任务 7.2.2 线路连接 7.2.3 利用C51语言实现基于DS18B20的单片机温度测控 7.2.4 利用汇编语言实现基于DS18B20的单片机温度测控 7.2.5 利用VC++.NET实现PC与无线数传模块温度测控 第8章 USB串行总线模块测控应用 8.1 USB总线在数据采集系统中的应用 8.1.1 USB总线及其数据采集系统的特点 8.1.2 采用USB传输的数据采集系统 8.1.3 典型USB数据采集模块及应用 8.1.4 VC++.NET数据采集与控制的方式 8.2 PC与USB数据采集模块测控应用实例 8.2.1 模拟量输入 8.2.2 模拟量输出 8.2.3 数字量输入 8.2.4 数字量输出 参考文献
书名:《Visual C#.NET串口通信及测控应用典型实例》(电子工业出版社.李江全.邓红涛.刘巧.李伟) PDF格式扫描版,全书分为8章,共369页。2012年5月出版。 全书压缩打包成3部分,这是第3部分 内容简介 本书从工程应用的角度出发,通过8个典型应用实例,包括PC与PC、PC与单片机、PC与PLC、PC与远程I/O模块、PC与智能仪器、PC与无线数传模块、Pc与USB数据采集模块等组成的测控系统,利用SerialPort控件和MSComm控件编写C#.NET串口通信程序,并对计算机测控系统中的4类典型应用((模拟量输入(AI)、模拟量输出(AO)、数字量输入(DI)和数字量输出(DO)的程序设计方法进行了详细的讲解。 目 录 第1章 PC与PC串口通信 1.1 串口通信概述 1.1.1 串口通信的基本概念 1.1.2 RS-232C接口标准 1.1.3 RS-422/485接口标准 1.1.4 串口通信线路连接 1.1.5 PC中的串行端口 1.1.6 虚拟串口的使用 1.2 VC++.NET串行通信控件与API函数 1.2.1 MSComm控件的使用 1.2.2 SerialPort控件的使用 1.2.3 串行通信API函数 1.3 PC与PC串口通信实例 1.3.1 两台PC串口通信 1.3.2 一台PC双串口互通信 第2章 PC与单片机串口通信 2.1 典型单片机开发板简介 2.1.1 单片机测控系统的组成 2.1.2 单片机开发板B的功能 2.1.3 单片机开发板B的主要电路 2.2 PC与单片机串口通信实例 2.2.1 PC与单个单片机串口通信 2.2.2 PC与多个单片机串口通信 2.3 PC与单片机串口通信测控应用实例 2.3.1 模拟量输入 2.3.2 模拟量输出 2.3.3 开关量输入 2.3.4 开关量输出 第3章 PC与西门子PLC串口通信 3.1 西门子PLC模拟量扩展模块与通信协议 3.1.1 西门子PLC模拟量输入模块 3.1.2 西门子PLC PPI通信协议 3.2 PC与西门子PLC串口通信测控应用实例 3.2.1 模拟量输入 3.2.2 模拟量输出 3.2.3 开关量输入 3.2.4 开关量输出 第4章 PC与三菱PLC串口通信 4.1 三菱PLC特殊功能模块与通信协议 4.1.1 FX2N系列PLC的特殊功能模块 4.1.2 三菱PLC编程口通信协议 4.2 PC与三菱PLC串口通信测控应用实例 4.2.1 模拟量输入 4.2.2 模拟量输出 4.2.3 开关量输入 4.2.4 开关量输出 第5章 PC与分布式I/O模块串口通信 5.1 典型分布式I/O模块简介 5.1.1 集散控制系统的结构与特点 5.1.2 ADAM4000远程数据采集控制系统 5.1.3 ADAM4000系列模块简介 5.1.4 ADAM4000系列模块的软件安装 5.2 PC与分布式I/O模块串口通信测控应用实例 5.2.1 模拟量输入 5.2.2 模拟量输出 5.2.3 数字量输入 5.2.4 数字量输出 第6章 PC与智能仪器串口通信 6.1 典型智能仪器简介 6.1.1 智能仪器的结构与特点 6.1.2 XMT-3000A型智能仪器的通信协议 6.2 PC与智能仪器串口通信测控应用实例 6.2.1 PC与单台智能仪器温度测控 6.2.2 PC与多台智能仪器温度测控 第7章 PC与无线数据传输模块串口通信 7.1 典型无线数传模块简介 7.1.1 无线数传技术概述 7.1.2 DTD46X系列无线数传模块 7.2 PC与无线数传模块串口通信测控应用实例 7.2.1 设计任务 7.2.2 线路连接 7.2.3 利用C51语言实现基于DS18B20的单片机温度测控 7.2.4 利用汇编语言实现基于DS18B20的单片机温度测控 7.2.5 利用VC++.NET实现PC与无线数传模块温度测控 第8章 USB串行总线模块测控应用 8.1 USB总线在数据采集系统中的应用 8.1.1 USB总线及其数据采集系统的特点 8.1.2 采用USB传输的数据采集系统 8.1.3 典型USB数据采集模块及应用 8.1.4 VC++.NET数据采集与控制的方式 8.2 PC与USB数据采集模块测控应用实例 8.2.1 模拟量输入 8.2.2 模拟量输出 8.2.3 数字量输入 8.2.4 数字量输出 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值