六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1401|回复: 0

.NET串口通讯解决方案

[复制链接]

升级  10%

1

主题

1

主题

1

主题

童生

Rank: 1

积分
5
 楼主| 发表于 2013-1-1 22:09:26 | 显示全部楼层 |阅读模式
.NET串口通讯解决方案

<div class="postbody"><div id="cnblogs_post_body">网上关于.NET串口通讯的文章不少,但大多只是一些对.NET串口通讯函数的简单封装,对于实际的操作和使用,并没有太直接的帮助。本人做过几个.NET下串口通讯的小项目,借鉴了一些前人的经验(特别是SharpGps)并结合自己的一些心得和体会,写下这篇文章,算是对自己这部分工作的一个总结。
本来这篇文章的题目叫“.NET串口通讯设计”,想想觉得如果叫这个名字,那就没有写下去的必要了(网上这样的文章大把)。至于这篇文章配得上“解决方案”这四个字否? (我也不知道~) 言归正传,正文开始…

  • 设计概要
      SerialPort.cs
      ComEvent.cs
      Enumerations.cs
      以及各种协议的具体实现类,如XXX_imp.cs

  • 通讯基础类SerialPort.cs
      主要封装一些.Net串口通讯已实现的一些常用方法,这个类和网上大多数介绍.Net串口通讯的文章所介绍的差不多,唯一不同的地方是在接收部分的处理(注:接收部分采用了异步的方式),利用了.Net的事件机制,将“接收数据”这一事件根据事件类型(即协议),告知给协议的具体实现类进行相应的处理。
<div class="cnblogs_Highlighter"><div class="cnblogs_code" style="background-color: #f5f5f5; border: #cccccc 1px solid; padding: 5px;">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;            }        }    }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表