|
|
.NET串口通讯解决方案
<div class="postbody"><div id="cnblogs_post_body">网上关于.NET串口通讯的文章不少,但大多只是一些对.NET串口通讯函数的简单封装,对于实际的操作和使用,并没有太直接的帮助。本人做过几个.NET下串口通讯的小项目,借鉴了一些前人的经验(特别是SharpGps)并结合自己的一些心得和体会,写下这篇文章,算是对自己这部分工作的一个总结。
本来这篇文章的题目叫&ldquo;.NET串口通讯设计&rdquo;,想想觉得如果叫这个名字,那就没有写下去的必要了(网上这样的文章大把)。至于这篇文章配得上&ldquo;解决方案&rdquo;这四个字否? (我也不知道~) 言归正传,正文开始&hellip;
SerialPort.cs
ComEvent.cs
Enumerations.cs
以及各种协议的具体实现类,如XXX_imp.cs
主要封装一些.Net串口通讯已实现的一些常用方法,这个类和网上大多数介绍.Net串口通讯的文章所介绍的差不多,唯一不同的地方是在接收部分的处理(注:接收部分采用了异步的方式),利用了.Net的事件机制,将&ldquo;接收数据&rdquo;这一事件根据事件类型(即协议),告知给协议的具体实现类进行相应的处理。
<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; } } } |
|