中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#異步數據接收串口操作類

發布時間:2020-07-08 03:25:23 來源:網絡 閱讀:5145 作者:WZM3558862 欄目:開發技術

C#異步數據接收串口操作類


  1. 使用C#調用傳統32位API實現串口操作,整個結構特別的簡單。接收數據只需要定義數據接收事件即可。

  2. 上傳源代碼我不會,需要源代碼的請與我(dyj057@gmail.com)聯系。你也可以教我怎么上傳源代碼。

  3. using System;

  4. using System.Runtime.InteropServices;

  5. /// <summary>

  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. /// </summary>

  23. namespace Ibms.Tool.IO

  24. {

  25.  /// <summary>

  26.  /// 當串口接收到數據時,會產生一個事件。

  27.  /// SPRecvDataArgs就是該事件的參數,參數中的RecvData包含接收到的數據。

  28.  /// 使用方法:

  29.  /// </summary>

  30.  public class SPRecvDataArgs:EventArgs

  31.  {

  32.   /// <summary>

  33.   /// 接收到的數據組成的字節數組

  34.   /// </summary>

  35.   private byte[] recvData;

  36.   /// <summary>

  37.   /// 構造函數,需要一個包含數據的byte[]作為初始化參數來實例化 SPRecvDataArgs

  38.   /// </summary>

  39.   /// <param name="recvData">接收到的數據</param>

  40.   public SPRecvDataArgs(byte[] recvData)

  41.   {

  42.    if( recvData == null)

  43.    {

  44.     throw(new ArgumentNullException());

  45.    }

  46.    this.recvData = recvData;

  47.   }

  48.   /// <summary>

  49.   /// 返回接收到的數據內容

  50.   /// </summary>

  51.   public byte[] RecvData

  52.   {

  53.    get

  54.    {

  55.     return recvData;

  56.    }

  57.   }

  58.  }

  59.  /// <summary>

  60.  /// 封裝動態鏈接庫IbmsSerialPort.dll的功能,提供在.NET環境中異步

  61.  /// 串口接收和發送功能。特別實現的是異步通過信號自動接收數據的模式。

  62.  /// </summary>

  63.  public class IbmsSerialPort:IDisposable

  64.  {

  65. #region 平臺調用聲明代碼

  66.   /// <summary>

  67.   /// 聲明IbmsSerialPort.dll的Ibms_OpenPort函數

  68.   /// </summary>

  69.   /// <param name="nPort">串口號</param>

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

  71.   /// <returns></returns>

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

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

  74.   /// <summary>

  75.   /// 聲明IbmsSerialPort.dll的Ibms_Close函數

  76.   /// </summary>

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

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

  79.   /// <summary>

  80.   /// 聲明IbmsSerialPort.dll的Ibms_SendData函數

  81.   /// </summary>

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

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

  84.   /// <returns></returns>

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

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

  87.   /// <summary>

  88.   /// 聲明IbmsSerialPort.dll的Ibms_SetFuncHandle函數

  89.   /// </summary>

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

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

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

  93. #endregion

  94.    

  95. #region 定義字段

  96.   /// <summary>

  97.   /// 定義數據處理委托,作為API的函數指針傳入動態鏈接庫

  98.   /// </summary>

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

  100.   /// <summary>

  101.   /// 定義數據接收事件的原型

  102.   /// </summary>

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

  104.   /// <summary>

  105.   /// 定義數據接收事件

  106.   /// </summary>

  107.   public event RecvData OnRecvData;

  108.   /// <summary>

  109.   /// 串口處理接收數據的委托

  110.   /// </summary>

  111.   private HandleFunc _handleDataFunc;

  112.   /// <summary>

  113.   /// 串口的編號,從1開始的整數,最大255

  114.   /// </summary>

  115.   private int port;

  116.   /// <summary>

  117.   /// 串口所支持的波特率,必須是標準波特率之一

  118.   /// </summary>

  119.   private StanderdRate rate;

  120.   /// <summary>

  121.   /// 串口當前的打開狀態

  122.   /// </summary>

  123.   private bool openStatus=false;

  124.   /// <summary>

  125.   /// 串口句柄

  126.   /// </summary>

  127.   private IntPtr portHandle;

  128.   #region 定義標準的串口波特率

  129.   /// <summary>

  130.   /// 標準的波特率

  131.   /// </summary>

  132.   public enum StanderdRate

  133.   {

  134.    R50=50,

  135.    R75=75,

  136.    R110=110,

  137.    R150=150,

  138.    R300=300,

  139.    R600=600,

  140.    R1200=1200,

  141.    R2400=2400,

  142.    R4800=4800,

  143.    R9600=9600,

  144.    R19200=19200,

  145.    R38400=38400,

  146.    R57600=57600,

  147.    R76800=76800,

  148.    R115200=115200

  149.   };

  150.   

  151.   #endregion

  152. #endregion 

  153. #region 定義方法

  154.   /// <summary>

  155.   /// 構造函數

  156.   /// </summary>

  157.   public IbmsSerialPort()

  158.   {

  159.    portHandle = (IntPtr)0;

  160.    _handleDataFunc = new HandleFunc(OnDllRecvData);

  161.   }

  162.   /// <summary>

  163.   /// 打開串口

  164.   /// </summary>

  165.   /// <param name="nPort">串口號</param>

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

  167.   /// /// <exception cref="ApplicationException">拋出應用程序異常,包換錯誤描述</exception>

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

  169.   {

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

  171.    {

  172.     throw(new ArgumentOutOfRangeException());

  173.    }

  174.    port = nPort;

  175.    rate = nRate;

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

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

  178.    {

  179.     thrownew ApplicationException("打開串口失敗"));

  180.    }

  181.    

  182.    //注冊函數指針

  183.    Ibms_SetFuncHandle( portHandle, _handleDataFunc );

  184.    openStatus = true;

  185.   }

  186.   /// <summary>

  187.   /// 關閉串口

  188.   /// </summary>

  189.   public void Close()

  190.   {

  191.    if( openStatus )

  192.    {

  193.     Ibms_Close( portHandle);

  194.    }

  195.    openStatus = false;

  196.   }

  197.   /// <summary>

  198.   /// 發送數據

  199.   /// </summary>

  200.   /// <param name="sendData">數據內容</param>

  201.   /// <exception cref="ApplicationException">拋出應用程序異常,包換錯誤描述</exception>

  202.   public void SendData( byte[] data )

  203.   {

  204.    if( !openStatus )

  205.    {

  206.     thrownew ApplicationException("串口沒有打開,發送數據失敗") );

  207.    }

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

  209.    {

  210.     thrownew ApplicationException("串口發送數據失敗") );

  211.    }

  212.   }

  213.   /// <summary>

  214.   /// 處理接收到的串口數據

  215.   /// </summary>

  216.   /// <param name="pData">串口數據接收緩沖區首地址</param>

  217.   /// <param name="nDataSize">數據大小,一般數據大小不超過2K</param>

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

  219.   {

  220.    int dataSize= nDataSize ;

  221.     

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

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

  224.    //復制數據到byte數組

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

  226.    {

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

  228.    }

  229.    //激發事件

  230.    OnRecvData( thisnew SPRecvDataArgs(data) );

  231.   }

  232. #endregion

  233. #region 定義屬性

  234.   /// <summary>

  235.   /// 返回當前的串口號

  236.   /// </summary>

  237.   public int Port

  238.   {

  239.    get

  240.    {

  241.     return port;

  242.    }

  243.   }

  244.   /// <summary>

  245.   /// 返回當前串口的波特率

  246.   /// </summary>

  247.   public StanderdRate Rate

  248.   {

  249.    get

  250.    {

  251.     return rate;

  252.    }

  253.   }

  254.   /// <summary>

  255.   /// 返回當前串口的狀態

  256.   /// </summary>

  257.   public bool OpenStatus

  258.   {

  259.    get

  260.    {

  261.     return openStatus;

  262.    }

  263.   }

  264. #endregion

  265.   

  266. #region 非托管資源的及時釋放

  267.   

  268.   /// <summary>

  269.   /// 因為包含了非托管的資源(占用系統串口),必須實現IDisposable接口

  270.   /// 在使用完該類的時候,必須記得調用Dispose(),回收系統資源

  271.   /// <example>

  272.   /// 

  273.   /// 方法1

  274.   /// {

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

  276.   ///  ...

  277.   ///  //在try-catch-finaly的finaly中釋放資源

  278.   ///  

  279.   ///  port.Dispose();

  280.   /// }

  281.   /// 

  282.   /// 方法2

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

  284.   /// {

  285.   ///  ...

  286.   /// }

  287.   /// 變量超出作用域時會自動調用其Dispose()方法

  288.   /// 

  289.   /// </example>

  290.   /// </summary>

  291.   ~IbmsSerialPort()

  292.   {

  293.    Dispose( false );

  294.   }

  295.   protected virtual void Dispose( bool disposing )

  296.   {

  297.    if( disposing )

  298.    {

  299.     //清理托管的對象

  300.    }

  301.    //清理非托管的資源

  302.    Close();

  303.   }

  304.   #region IDisposable 成員

  305.   public void Dispose()

  306.   {

  307.    // TODO:  添加 SerialPort.Dispose 實現

  308.    Dispose( true );

  309.    GC.SuppressFinalize(this);

  310.   }

  311.   #endregion

  312. #endregion

  313.  }

  314. }


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富民县| 武冈市| 突泉县| 肇州县| 竹山县| 胶州市| 宁德市| 太原市| 古蔺县| 沙洋县| 海晏县| 荣昌县| 邛崃市| 古交市| 兰西县| 翁源县| 关岭| 密山市| 蒙阴县| 广东省| 隆昌县| 张家口市| 苍南县| 东台市| 梨树县| 平山县| 西乌珠穆沁旗| 阜南县| 浙江省| 富源县| 平江县| 上虞市| 会东县| 安阳县| 镇原县| 吉林省| 眉山市| 博野县| 繁昌县| 远安县| 驻马店市|