C#异步数据接收串口操作类-创新互联

C#异步数据接收串口操作类

站在用户的角度思考问题,与客户深入沟通,找到昌邑网站设计与昌邑网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、成都网站建设、企业官网、英文网站、手机端网站、网站推广、域名申请、虚拟空间、企业邮箱。业务覆盖昌邑地区。
  1. 使用C#调用传统32位API实现串口操作,整个结构特别的简单。接收数据只需要定义数据接收事件即可。

  2. 上传源代码我不会,需要源代码的请与我(dyj057@gmail.com)联系。你也可以教我怎么上传源代码。

  3. using System;

  4. using System.Runtime.InteropServices;

  5. /// 

  6. /// (C)2003-2005 C2217 Studio  保留所有权利

  7. ///

  8. /// 文件名称:     IbmsSerialPort.cs

  9. /// 文件ID:

  10. /// 文件说明:

  11. ///         封装动态链接库IbmsSerialPort.dll的功能,提供在.NET环境中

  12. ///         串口异步接收和发送数据的功能。

  13. ///

  14. /// 当前版本:   1.0

  15. ///

  16. /// 作者:    邓杨均

  17. /// 创建日期:   2005-2-2

  18. /// 最后修改日期: 2005-2-2

  19. ///

  20. /// 历史修改记录:

  21. ///

  22. /// 

  23. namespace Ibms.Tool.IO

  24. {

  25.  /// 

  26.  /// 当串口接收到数据时,会产生一个事件。

  27.  /// SPRecvDataArgs就是该事件的参数,参数中的RecvData包含接收到的数据。

  28.  /// 使用方法:

  29.  /// 

  30.  public class SPRecvDataArgs:EventArgs

  31.  {

  32.   /// 

  33.   /// 接收到的数据组成的字节数组

  34.   /// 

  35.   private byte[] recvData;

  36.   /// 

  37.   /// 构造函数,需要一个包含数据的byte[]作为初始化参数来实例化 SPRecvDataArgs

  38.   /// 

  39.   /// 接收到的数据

  40.   public SPRecvDataArgs(byte[] recvData)

  41.   {

  42.    if( recvData == null)

  43.    {

  44.     throw(new ArgumentNullException());

  45.    }

  46.    this.recvData = recvData;

  47.   }

  48.   /// 

  49.   /// 返回接收到的数据内容

  50.   /// 

  51.   public byte[] RecvData

  52.   {

  53.    get

  54.    {

  55.     return recvData;

  56.    }

  57.   }

  58.  }

  59.  /// 

  60.  /// 封装动态链接库IbmsSerialPort.dll的功能,提供在.NET环境中异步

  61.  /// 串口接收和发送功能。特别实现的是异步通过信号自动接收数据的模式。

  62.  /// 

  63.  public class IbmsSerialPort:IDisposable

  64.  {

  65. #region 平台调用声明代码

  66.   /// 

  67.   /// 声明IbmsSerialPort.dll的Ibms_OpenPort函数

  68.   /// 

  69.   /// 串口号

  70.   /// 波特率

  71.   /// 

  72.   [DllImport("IbmsSerialPort.dll")]

  73.   public static extern IntPtr Ibms_OpenPort(int nPort, int nRate);

  74.   /// 

  75.   /// 声明IbmsSerialPort.dll的Ibms_Close函数

  76.   /// 

  77.   [DllImport("IbmsSerialPort.dll")]

  78.   public static extern void Ibms_Close( IntPtr port);

  79.   /// 

  80.   /// 声明IbmsSerialPort.dll的Ibms_SendData函数

  81.   /// 

  82.   /// 

  83.   /// 

  84.   /// 

  85.   [DllImport("IbmsSerialPort.dll")]

  86.   public static extern bool Ibms_SendData( IntPtr port, byte[] data,int nDataSize);

  87.   /// 

  88.   /// 声明IbmsSerialPort.dll的Ibms_SetFuncHandle函数

  89.   /// 

  90.   /// 

  91.   [DllImport("IbmsSerialPort.dll")]

  92.   public static extern void Ibms_SetFuncHandle( IntPtr port, HandleFunc handDataFunc);

  93. #endregion

  94. #region 定义字段

  95.   /// 

  96.   /// 定义数据处理委托,作为API的函数指针传入动态链接库

  97.   /// 

  98.   public delegate void HandleFunc(IntPtr pData, int nDataSize);

  99.   /// 

  100.   /// 定义数据接收事件的原型

  101.   /// 

  102.   public delegate void RecvData(object sender,SPRecvDataArgs e);

  103.   /// 

  104.   /// 定义数据接收事件

  105.   /// 

  106.   public event RecvData OnRecvData;

  107.   /// 

  108.   /// 串口处理接收数据的委托

  109.   /// 

  110.   private HandleFunc _handleDataFunc;

  111.   /// 

  112.   /// 串口的编号,从1开始的整数,大255

  113.   /// 

  114.   private int port;

  115.   /// 

  116.   /// 串口所支持的波特率,必须是标准波特率之一

  117.   /// 

  118.   private StanderdRate rate;

  119.   /// 

  120.   /// 串口当前的打开状态

  121.   /// 

  122.   private bool openStatus=false;

  123.   /// 

  124.   /// 串口句柄

  125.   /// 

  126.   private IntPtr portHandle;

  127.   #region 定义标准的串口波特率

  128.   /// 

  129.   /// 标准的波特率

  130.   /// 

  131.   public enum StanderdRate

  132.   {

  133.    R50=50,

  134.    R75=75,

  135.    R110=110,

  136.    R150=150,

  137.    R300=300,

  138.    R600=600,

  139.    R1200=1200,

  140.    R2400=2400,

  141.    R4800=4800,

  142.    R9600=9600,

  143.    R19200=19200,

  144.    R38400=38400,

  145.    R57600=57600,

  146.    R76800=76800,

  147.    R115200=115200

  148.   };

  149.   #endregion

  150. #endregion

  151. #region 定义方法

  152.   /// 

  153.   /// 构造函数

  154.   /// 

  155.   public IbmsSerialPort()

  156.   {

  157.    portHandle = (IntPtr)0;

  158.    _handleDataFunc = new HandleFunc(OnDllRecvData);

  159.   }

  160.   /// 

  161.   /// 打开串口

  162.   /// 

  163.   /// 串口号

  164.   /// 波特率

  165.   /// /// 抛出应用程序异常,包换错误描述

  166.   public void Open(int nPort, StanderdRate nRate)

  167.   {

  168.    if(nPort > 255 || nPort < 0)

  169.    {

  170.     throw(new ArgumentOutOfRangeException());

  171.    }

  172.    port = nPort;

  173.    rate = nRate;

  174.    portHandle = Ibms_OpenPort( port, (int)rate );

  175.    if( (IntPtr)0 == portHandle  )

  176.    {

  177.     throw( new ApplicationException("打开串口失败"));

  178.    }

  179.    //注册函数指针

  180.    Ibms_SetFuncHandle( portHandle, _handleDataFunc );

  181.    openStatus = true;

  182.   }

  183.   /// 

  184.   /// 关闭串口

  185.   /// 

  186.   public void Close()

  187.   {

  188.    if( openStatus )

  189.    {

  190.     Ibms_Close( portHandle);

  191.    }

  192.    openStatus = false;

  193.   }

  194.   /// 

  195.   /// 发送数据

  196.   /// 

  197.   /// 数据内容

  198.   /// 抛出应用程序异常,包换错误描述

  199.   public void SendData( byte[] data )

  200.   {

  201.    if( !openStatus )

  202.    {

  203.     throw( new ApplicationException("串口没有打开,发送数据失败") );

  204.    }

  205.    if( !Ibms_SendData( portHandle, data, data.Length ) )

  206.    {

  207.     throw( new ApplicationException("串口发送数据失败") );

  208.    }

  209.   }

  210.   /// 

  211.   /// 处理接收到的串口数据

  212.   /// 

  213.   /// 串口数据接收缓冲区首地址

  214.   /// 数据大小,一般数据大小不超过2K

  215.   unsafe protected void OnDllRecvData(IntPtr pUnhandleData, int nDataSize)

  216.   {

  217.    int dataSize= nDataSize ;

  218.    byte * pData =(byte *) pUnhandleData;

  219.    byte[] data = new byte[dataSize];

  220.    //复制数据到byte数组

  221.    for(int i=0; i

  222.    {

  223.     data[i]= pData[i];

  224.    }

  225.    //激发事件

  226.    OnRecvData( this, new SPRecvDataArgs(data) );

  227.   }

  228. #endregion

  229. #region 定义属性

  230.   /// 

  231.   /// 返回当前的串口号

  232.   /// 

  233.   public int Port

  234.   {

  235.    get

  236.    {

  237.     return port;

  238.    }

  239.   }

  240.   /// 

  241.   /// 返回当前串口的波特率

  242.   /// 

  243.   public StanderdRate Rate

  244.   {

  245.    get

  246.    {

  247.     return rate;

  248.    }

  249.   }

  250.   /// 

  251.   /// 返回当前串口的状态

  252.   /// 

  253.   public bool OpenStatus

  254.   {

  255.    get

  256.    {

  257.     return openStatus;

  258.    }

  259.   }

  260. #endregion

  261. #region 非托管资源的及时释放

  262.   /// 

  263.   /// 因为包含了非托管的资源(占用系统串口),必须实现IDisposable接口

  264.   /// 在使用完该类的时候,必须记得调用Dispose(),回收系统资源

  265.   /// 

  266.   ///

  267.   /// 方法1

  268.   /// {

  269.   ///  SerialPort port =new SerialPort();

  270.   ///  ...

  271.   ///  //在try-catch-finaly的finaly中释放资源

  272.   ///

  273.   ///  port.Dispose();

  274.   /// }

  275.   ///

  276.   /// 方法2

  277.   /// using( SerialPort port = new SerialPort())

  278.   /// {

  279.   ///  ...

  280.   /// }

  281.   /// 变量超出作用域时会自动调用其Dispose()方法

  282.   ///

  283.   /// 

  284.   /// 

  285.   ~IbmsSerialPort()

  286.   {

  287.    Dispose( false );

  288.   }

  289.   protected virtual void Dispose( bool disposing )

  290.   {

  291.    if( disposing )

  292.    {

  293.     //清理托管的对象

  294.    }

  295.    //清理非托管的资源

  296.    Close();

  297.   }

  298.   #region IDisposable 成员

  299.   public void Dispose()

  300.   {

  301.    // TODO:  添加 SerialPort.Dispose 实现

  302.    Dispose( true );

  303.    GC.SuppressFinalize(this);

  304.   }

  305.   #endregion

  306. #endregion

  307.  }

  308. }

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文名称:C#异步数据接收串口操作类-创新互联
分享链接:http://scyanting.com/article/gpjhj.html