技术开发 频道

串口通信类


【IT168技术文档】

  现假设有一系列产品我们需要使用软件控制其运作,我们可以通过向设备发送各种指令来达到此要求,首先由于产品种类较多,而且有些产品是纵向升级的,升级之后的产品基本上保持原有功能基础上加了些新功能,基于此要求,我们在设计相应类时,可以使用继承的方法,通信基类使用抽象类不允许直接实例化,仅提供一般串口操作的方法,比如发送指令及关串口等操作(初始化串口及打开串口操作在构造函数中完成),这样有任何产品只要从这个类继承即可调用基类函数,而且考虑到产品升级,只要继承相应的基类,重新相应的方法即可,即可以重用代码,结构又比较清晰,下面是一些示例代码
using System; using System.IO.Ports; using System.Threading; namespace TripodDemo { /**//// <summary> /// 串口操作通用类,抽象类防止类别直接实例化 /// </summary> public abstract class ComPort : IDisposable { /**//// <summary> /// 使用变量锁定对象 /// </summary> private object objComm = new object(); /**//// <summary> /// 串口对象 /// </summary> private SerialPort com; private bool disposed = false; SerialPort#region SerialPort public ComPort() { com = new SerialPort("COM1", 9600); OpenCom(); } public ComPort(SerialPort sp) { com = sp; OpenCom(); } private void OpenCom() { try { if (!com.IsOpen) { com.ReadTimeout = 3000; com.WriteTimeout = 3000; com.Open(); } } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion Dispose & Close#region Dispose & Close public void Dispose() { Dispose(true); } private void Dispose(bool disposing) { if (!disposed && disposing && com != null && com.IsOpen) { com.Close(); disposed = true; } } public void Close() { Dispose(true); } #endregion 发送数据#region 发送数据 /**//// <summary> /// 发送数据 /// </summary> /// <param name="bwrite">写数据</param> /// <param name="returnDataLen">读数据长度</param> /// <param name="bread">读数据</param> /// <param name="msel">超时毫秒</param> /// <returns>是否执行成功</returns> public bool SendData(byte[] bwrite, int returnDataLen, out byte[] bread, int msel) { lock (objComm) { bread = new byte[returnDataLen]; long l = DateTime.UtcNow.Ticks + msel * 10000; com.DiscardInBuffer(); com.DiscardOutBuffer(); com.Write(bwrite, 0, bwrite.Length); while (com.BytesToRead < returnDataLen && DateTime.UtcNow.Ticks < l) { Thread.Sleep(1); } //串口无反应 if (com.BytesToRead < returnDataLen) { return false; } try { com.Read(bread, 0, bread.Length); return true; } catch (TimeoutException) { return false; } } } #endregion } }
0
相关文章