真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#異步數(shù)據(jù)接收串口操作類-創(chuàng)新互聯(lián)

C#異步數(shù)據(jù)接收串口操作類

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到昌邑網(wǎng)站設(shè)計(jì)與昌邑網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋昌邑地區(qū)。
  1. 使用C#調(diào)用傳統(tǒng)32位API實(shí)現(xiàn)串口操作,整個(gè)結(jié)構(gòu)特別的簡(jiǎn)單。接收數(shù)據(jù)只需要定義數(shù)據(jù)接收事件即可。

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

  3. using System;

  4. using System.Runtime.InteropServices;

  5. /// 

  6. /// (C)2003-2005 C2217 Studio  保留所有權(quán)利

  7. ///

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

  9. /// 文件ID:

  10. /// 文件說(shuō)明:

  11. ///         封裝動(dòng)態(tài)鏈接庫(kù)IbmsSerialPort.dll的功能,提供在.NET環(huán)境中

  12. ///         串口異步接收和發(fā)送數(shù)據(jù)的功能。

  13. ///

  14. /// 當(dāng)前版本:   1.0

  15. ///

  16. /// 作者:    鄧楊均

  17. /// 創(chuàng)建日期:   2005-2-2

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

  19. ///

  20. /// 歷史修改記錄:

  21. ///

  22. /// 

  23. namespace Ibms.Tool.IO

  24. {

  25.  /// 

  26.  /// 當(dāng)串口接收到數(shù)據(jù)時(shí),會(huì)產(chǎn)生一個(gè)事件。

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

  28.  /// 使用方法:

  29.  /// 

  30.  public class SPRecvDataArgs:EventArgs

  31.  {

  32.   /// 

  33.   /// 接收到的數(shù)據(jù)組成的字節(jié)數(shù)組

  34.   /// 

  35.   private byte[] recvData;

  36.   /// 

  37.   /// 構(gòu)造函數(shù),需要一個(gè)包含數(shù)據(jù)的byte[]作為初始化參數(shù)來(lái)實(shí)例化 SPRecvDataArgs

  38.   /// 

  39.   /// 接收到的數(shù)據(jù)

  40.   public SPRecvDataArgs(byte[] recvData)

  41.   {

  42.    if( recvData == null)

  43.    {

  44.     throw(new ArgumentNullException());

  45.    }

  46.    this.recvData = recvData;

  47.   }

  48.   /// 

  49.   /// 返回接收到的數(shù)據(jù)內(nèi)容

  50.   /// 

  51.   public byte[] RecvData

  52.   {

  53.    get

  54.    {

  55.     return recvData;

  56.    }

  57.   }

  58.  }

  59.  /// 

  60.  /// 封裝動(dòng)態(tài)鏈接庫(kù)IbmsSerialPort.dll的功能,提供在.NET環(huán)境中異步

  61.  /// 串口接收和發(fā)送功能。特別實(shí)現(xiàn)的是異步通過(guò)信號(hào)自動(dòng)接收數(shù)據(jù)的模式。

  62.  /// 

  63.  public class IbmsSerialPort:IDisposable

  64.  {

  65. #region 平臺(tái)調(diào)用聲明代碼

  66.   /// 

  67.   /// 聲明IbmsSerialPort.dll的Ibms_OpenPort函數(shù)

  68.   /// 

  69.   /// 串口號(hào)

  70.   /// 波特率

  71.   /// 

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

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

  74.   /// 

  75.   /// 聲明IbmsSerialPort.dll的Ibms_Close函數(shù)

  76.   /// 

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

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

  79.   /// 

  80.   /// 聲明IbmsSerialPort.dll的Ibms_SendData函數(shù)

  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函數(shù)

  89.   /// 

  90.   /// 

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

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

  93. #endregion

  94. #region 定義字段

  95.   /// 

  96.   /// 定義數(shù)據(jù)處理委托,作為API的函數(shù)指針傳入動(dòng)態(tài)鏈接庫(kù)

  97.   /// 

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

  99.   /// 

  100.   /// 定義數(shù)據(jù)接收事件的原型

  101.   /// 

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

  103.   /// 

  104.   /// 定義數(shù)據(jù)接收事件

  105.   /// 

  106.   public event RecvData OnRecvData;

  107.   /// 

  108.   /// 串口處理接收數(shù)據(jù)的委托

  109.   /// 

  110.   private HandleFunc _handleDataFunc;

  111.   /// 

  112.   /// 串口的編號(hào),從1開始的整數(shù),大255

  113.   /// 

  114.   private int port;

  115.   /// 

  116.   /// 串口所支持的波特率,必須是標(biāo)準(zhǔn)波特率之一

  117.   /// 

  118.   private StanderdRate rate;

  119.   /// 

  120.   /// 串口當(dāng)前的打開狀態(tài)

  121.   /// 

  122.   private bool openStatus=false;

  123.   /// 

  124.   /// 串口句柄

  125.   /// 

  126.   private IntPtr portHandle;

  127.   #region 定義標(biāo)準(zhǔn)的串口波特率

  128.   /// 

  129.   /// 標(biāo)準(zhǔn)的波特率

  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.   /// 構(gòu)造函數(shù)

  154.   /// 

  155.   public IbmsSerialPort()

  156.   {

  157.    portHandle = (IntPtr)0;

  158.    _handleDataFunc = new HandleFunc(OnDllRecvData);

  159.   }

  160.   /// 

  161.   /// 打開串口

  162.   /// 

  163.   /// 串口號(hào)

  164.   /// 波特率

  165.   /// /// 拋出應(yīng)用程序異常,包換錯(cuò)誤描述

  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.    //注冊(cè)函數(shù)指針

  180.    Ibms_SetFuncHandle( portHandle, _handleDataFunc );

  181.    openStatus = true;

  182.   }

  183.   /// 

  184.   /// 關(guān)閉串口

  185.   /// 

  186.   public void Close()

  187.   {

  188.    if( openStatus )

  189.    {

  190.     Ibms_Close( portHandle);

  191.    }

  192.    openStatus = false;

  193.   }

  194.   /// 

  195.   /// 發(fā)送數(shù)據(jù)

  196.   /// 

  197.   /// 數(shù)據(jù)內(nèi)容

  198.   /// 拋出應(yīng)用程序異常,包換錯(cuò)誤描述

  199.   public void SendData( byte[] data )

  200.   {

  201.    if( !openStatus )

  202.    {

  203.     throw( new ApplicationException("串口沒(méi)有打開,發(fā)送數(shù)據(jù)失敗") );

  204.    }

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

  206.    {

  207.     throw( new ApplicationException("串口發(fā)送數(shù)據(jù)失敗") );

  208.    }

  209.   }

  210.   /// 

  211.   /// 處理接收到的串口數(shù)據(jù)

  212.   /// 

  213.   /// 串口數(shù)據(jù)接收緩沖區(qū)首地址

  214.   /// 數(shù)據(jù)大小,一般數(shù)據(jù)大小不超過(guò)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.    //復(fù)制數(shù)據(jù)到byte數(shù)組

  221.    for(int i=0; i

  222.    {

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

  224.    }

  225.    //激發(fā)事件

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

  227.   }

  228. #endregion

  229. #region 定義屬性

  230.   /// 

  231.   /// 返回當(dāng)前的串口號(hào)

  232.   /// 

  233.   public int Port

  234.   {

  235.    get

  236.    {

  237.     return port;

  238.    }

  239.   }

  240.   /// 

  241.   /// 返回當(dāng)前串口的波特率

  242.   /// 

  243.   public StanderdRate Rate

  244.   {

  245.    get

  246.    {

  247.     return rate;

  248.    }

  249.   }

  250.   /// 

  251.   /// 返回當(dāng)前串口的狀態(tài)

  252.   /// 

  253.   public bool OpenStatus

  254.   {

  255.    get

  256.    {

  257.     return openStatus;

  258.    }

  259.   }

  260. #endregion

  261. #region 非托管資源的及時(shí)釋放

  262.   /// 

  263.   /// 因?yàn)榘朔峭泄艿馁Y源(占用系統(tǒng)串口),必須實(shí)現(xiàn)IDisposable接口

  264.   /// 在使用完該類的時(shí)候,必須記得調(diào)用Dispose(),回收系統(tǒng)資源

  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.   /// 變量超出作用域時(shí)會(huì)自動(dòng)調(diào)用其Dispose()方法

  282.   ///

  283.   /// 

  284.   /// 

  285.   ~IbmsSerialPort()

  286.   {

  287.    Dispose( false );

  288.   }

  289.   protected virtual void Dispose( bool disposing )

  290.   {

  291.    if( disposing )

  292.    {

  293.     //清理托管的對(duì)象

  294.    }

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

  296.    Close();

  297.   }

  298.   #region IDisposable 成員

  299.   public void Dispose()

  300.   {

  301.    // TODO:  添加 SerialPort.Dispose 實(shí)現(xiàn)

  302.    Dispose( true );

  303.    GC.SuppressFinalize(this);

  304.   }

  305.   #endregion

  306. #endregion

  307.  }

  308. }

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)頁(yè)標(biāo)題:C#異步數(shù)據(jù)接收串口操作類-創(chuàng)新互聯(lián)
本文URL:http://weahome.cn/article/gpjhj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部