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

发布时间:2020-07-08 03:25:23 作者:WZM3558862
阅读:5150
开发者专用服务器限时活动,0元免费领! 查看>>

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

  1. 使用C#调用传统32位API实现串口操作,整个结构特别的简单。接收数据只需要定义数据接收事件即可。

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

  3. {

  4.  {

  5.   /// <summary>

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

  7.   /// </summary>

  8.   private byte[] recvData;

  9.   /// <summary>

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

  11.   /// </summary>

  12.   /// <param name="recvData">接收到的数据</param>

  13.   public SPRecvDataArgs(byte[] recvData)

  14.   {

  15.    if( recvData == null)

  16.    {

  17.    }

  18.    this.recvData = recvData;

  19.   }

  20.   /// <summary>

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

  22.   /// </summary>

  23.   public byte[] RecvData

  24.   {

  25.    get

  26.    {

  27.    }

  28.   }

  29.  }

  30.  {

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

  32.   /// <summary>

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

  34.   /// </summary>

  35.   /// <param name="nPort">串口号</param>

  36.   /// <param name="nRate">波特率</param>

  37.   /// <returns></returns>

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

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

  40.   /// <summary>

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

  42.   /// </summary>

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

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

  45.   /// <summary>

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

  47.   /// </summary>

  48.   /// <param name="data"></param>

  49.   /// <param name="nDataSize"></param>

  50.   /// <returns></returns>

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

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

  53.   /// <summary>

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

  55.   /// </summary>

  56.   /// <param name="handDataFunc"></param>

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

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

  59. #endregion

  60.    

  61. #region 定义字段

  62.   /// <summary>

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

  64.   /// </summary>

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

  66.   /// <summary>

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

  68.   /// </summary>

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

  70.   /// <summary>

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

  72.   /// </summary>

  73.   public event RecvData OnRecvData;

  74.   /// <summary>

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

  76.   /// </summary>

  77.   private HandleFunc _handleDataFunc;

  78.   /// <summary>

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

  80.   /// </summary>

  81.   private int port;

  82.   /// <summary>

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

  84.   /// </summary>

  85.   private StanderdRate rate;

  86.   /// <summary>

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

  88.   /// </summary>

  89.   private bool openStatus=false;

  90.   /// <summary>

  91.   /// 串口句柄

  92.   /// </summary>

  93.   private IntPtr portHandle;

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

  95.   /// <summary>

  96.   /// 标准的波特率

  97.   /// </summary>

  98.   public enum StanderdRate

  99.   {

  100.    R50=50,

  101.    R75=75,

  102.    R110=110,

  103.    R150=150,

  104.    R300=300,

  105.    R600=600,

  106.    R1200=1200,

  107.    R2400=2400,

  108.    R4800=4800,

  109.    R9600=9600,

  110.    R19200=19200,

  111.    R38400=38400,

  112.    R57600=57600,

  113.    R76800=76800,

  114.    R115200=115200

  115.   };

  116.   

  117.   #endregion

  118. #endregion 

  119. #region 定义方法

  120.   /// <summary>

  121.   /// 构造函数

  122.   /// </summary>

  123.   public IbmsSerialPort()

  124.   {

  125.    portHandle = (IntPtr)0;

  126.    _handleDataFunc = new HandleFunc(OnDllRecvData);

  127.   }

  128.   /// <summary>

  129.   /// 打开串口

  130.   /// </summary>

  131.   /// <param name="nPort">串口号</param>

  132.   /// <param name="nRate">波特率</param>

  133.   /// /// <exception cref="ApplicationException">抛出应用程序异常,包换错误描述</exception>

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

  135.   {

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

  137.    {

  138.    }

  139.    port = nPort;

  140.    rate = nRate;

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

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

  143.    {

  144.    }

  145.    

  146.    //注册函数指针

  147.    Ibms_SetFuncHandle( portHandle, _handleDataFunc );

  148.    openStatus = true;

  149.   }

  150.   /// <summary>

  151.   /// 关闭串口

  152.   /// </summary>

  153.   public void Close()

  154.   {

  155.    if( openStatus )

  156.    {

  157.     Ibms_Close( portHandle);

  158.    }

  159.    openStatus = false;

  160.   }

  161.   /// <summary>

  162.   /// 发送数据

  163.   /// </summary>

  164.   /// <param name="sendData">数据内容</param>

  165.   /// <exception cref="ApplicationException">抛出应用程序异常,包换错误描述</exception>

  166.   public void SendData( byte[] data )

  167.   {

  168.    if( !openStatus )

  169.    {

  170.    }

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

  172.    {

  173.    }

  174.   }

  175.   /// <summary>

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

  177.   /// </summary>

  178.   /// <param name="pData">串口数据接收缓冲区首地址</param>

  179.   /// <param name="nDataSize">数据大小,一般数据大小不超过2K</param>

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

  181.   {

  182.    int dataSize= nDataSize ;

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

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

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

  186.    for(int i=0; i<dataSize; i++)

  187.    {

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

  189.    }

  190.    //激发事件

  191.    OnRecvData( thisnew SPRecvDataArgs(data) );

  192.   }

  193. #endregion

  194. #region 定义属性

  195.   /// <summary>

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

  197.   /// </summary>

  198.   public int Port

  199.   {

  200.    get

  201.    {

  202.    }

  203.   }

  204.   /// <summary>

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

  206.   /// </summary>

  207.   public StanderdRate Rate

  208.   {

  209.    get

  210.    {

  211.    }

  212.   }

  213.   /// <summary>

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

  215.   /// </summary>

  216.   public bool OpenStatus

  217.   {

  218.    get

  219.    {

  220.    }

  221.   }

  222. #endregion

  223.   

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

  225.   

  226.   /// <summary>

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

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

  229.   /// <example>

  230.   /// 

  231.   /// 方法1

  232.   /// {

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

  234.   ///  ...

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

  236.   ///  

  237.   ///  port.Dispose();

  238.   /// }

  239.   /// 

  240.   /// 方法2

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

  242.   /// {

  243.   ///  ...

  244.   /// }

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

  246.   /// 

  247.   /// </example>

  248.   /// </summary>

  249.   ~IbmsSerialPort()

  250.   {

  251.    Dispose( false );

  252.   }

  253.   protected virtual void Dispose( bool disposing )

  254.   {

  255.    if( disposing )

  256.    {

  257.    }

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

  259.    Close();

  260.   }

  261.   #region IDisposable 成员

  262.   public void Dispose()

  263.   {

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

  265.    Dispose( true );

  266.    GC.SuppressFinalize(this);

  267.   }

  268.   #endregion

  269. #endregion

  270.  }

  271. }

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. C#抓取ZigBee串口数据代码
  2. C# FTP操作类

开发者交流群:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:用exe控制另一个exe并调用函数

下一篇:python 语法和数据类型、运算符和表达式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
开发者交流群×