<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    注銷

    注銷

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      112 隨筆 :: 7 文章 :: 18 評論 :: 0 Trackbacks
     使用C#調(diào)用傳統(tǒng)32位API實現(xiàn)串口操作,整個結(jié)構(gòu)特別的簡單。接收數(shù)據(jù)只需要定義數(shù)據(jù)接收事件即可。
      
      上傳源代碼我不會,需要源代碼的請與我(dyj057@gmail.com)聯(lián)系。你也可以教我怎么上傳源代碼。
      
      using System;
      using System.Runtime.InteropServices;
      
      /// <summary>
      /// (C)2003-2005 C2217 Studio 保留所有權(quán)利
      ///
      /// 文件名稱:   IbmsSerialPort.cs
      /// 文件ID:
      /// 文件說明:
      ///     封裝動態(tài)鏈接庫IbmsSerialPort.dll的功能,提供在.NET環(huán)境中
      ///     串口異步接收和發(fā)送數(shù)據(jù)的功能。
      ///
      /// 當(dāng)前版本:  1.0
      ///
      /// 作者:  鄧楊均
      /// 創(chuàng)建日期:  2005-2-2
      /// 最后修改日期: 2005-2-2
      ///
      /// 歷史修改記錄:
      ///
      /// </summary>
      
      namespace Ibms.Tool.IO
      {
      
      /// <summary>
      /// 當(dāng)串口接收到數(shù)據(jù)時,會產(chǎn)生一個事件。
      /// SPRecvDataArgs就是該事件的參數(shù),參數(shù)中的RecvData包含接收到的數(shù)據(jù)。
      /// 使用方法:
      /// </summary>
      public class SPRecvDataArgs:EventArgs
      {
      /// <summary>
      /// 接收到的數(shù)據(jù)組成的字節(jié)數(shù)組
      /// </summary>
      private byte[] recvData;
      
      /// <summary>
      /// 構(gòu)造函數(shù),需要一個包含數(shù)據(jù)的byte[]作為初始化參數(shù)來實例化 SPRecvDataArgs
      /// </summary>
      /// <param name="recvData">接收到的數(shù)據(jù)</param>
      public SPRecvDataArgs(byte[] recvData)
      {
      if( recvData == null)
      {
      throw(new ArgumentNullException());
      }
      
      this.recvData = recvData;
      }
      
      /// <summary>
      /// 返回接收到的數(shù)據(jù)內(nèi)容
      /// </summary>
      public byte[] RecvData
      {
      get
      {
      return recvData;
      }
      }
      }
      
      /// <summary>
      /// 封裝動態(tài)鏈接庫IbmsSerialPort.dll的功能,提供在.NET環(huán)境中異步
      /// 串口接收和發(fā)送功能。特別實現(xiàn)的是異步通過信號自動接收數(shù)據(jù)的模式。
      /// </summary>
      public class IbmsSerialPort:IDisposable
      {
      
      #region 平臺調(diào)用聲明代碼
      
      /// <summary>
      /// 聲明IbmsSerialPort.dll的Ibms_OpenPort函數(shù)
      /// </summary>
      /// <param name="nPort">串口號</param>
      /// <param name="nRate">波特率</param>
      /// <returns></returns>
      [DllImport("IbmsSerialPort.dll")]
      public static extern IntPtr Ibms_OpenPort(int nPort, int nRate);
      
      /// <summary>
      /// 聲明IbmsSerialPort.dll的Ibms_Close函數(shù)
      /// </summary>
      [DllImport("IbmsSerialPort.dll")]
      public static extern void Ibms_Close( IntPtr port);
      
      /// <summary>
      /// 聲明IbmsSerialPort.dll的Ibms_SendData函數(shù)
      /// </summary>
      /// <param name="data"></param>
      /// <param name="nDataSize"></param>
      /// <returns></returns>
      [DllImport("IbmsSerialPort.dll")]
      public static extern bool Ibms_SendData( IntPtr port, byte[] data,int nDataSize);
      
      /// <summary>
      /// 聲明IbmsSerialPort.dll的Ibms_SetFuncHandle函數(shù)
      /// </summary>
      /// <param name="handDataFunc"></param>
      [DllImport("IbmsSerialPort.dll")]
      public static extern void Ibms_SetFuncHandle( IntPtr port, HandleFunc handDataFunc);
      
      #endregion
      
      #region 定義字段
      
      /// <summary>
      /// 定義數(shù)據(jù)處理委托,作為API的函數(shù)指針傳入動態(tài)鏈接庫
      /// </summary>
      public delegate void HandleFunc(IntPtr pData, int nDataSize);
      
      /// <summary>
      /// 定義數(shù)據(jù)接收事件的原型
      /// </summary>
      public delegate void RecvData(object sender,SPRecvDataArgs e);
      
      /// <summary>
      /// 定義數(shù)據(jù)接收事件
      /// </summary>
      public event RecvData OnRecvData;
      
      /// <summary>
      /// 串口處理接收數(shù)據(jù)的委托
      /// </summary>
      private HandleFunc _handleDataFunc;
      
      /// <summary>
      /// 串口的編號,從1開始的整數(shù),最大255
      /// </summary>
      private int port;
      
      /// <summary>
      /// 串口所支持的波特率,必須是標(biāo)準(zhǔn)波特率之一
      /// </summary>
      private StanderdRate rate;
      
      /// <summary>
      /// 串口當(dāng)前的打開狀態(tài)
      /// </summary>
      private bool openStatus=false;
      
      /// <summary>
      /// 串口句柄
      /// </summary>
      private IntPtr portHandle;
      
      #region 定義標(biāo)準(zhǔn)的串口波特率
      
      /// <summary>
      /// 標(biāo)準(zhǔn)的波特率
      /// </summary>
      public enum StanderdRate
      {
      R50=50,
      R75=75,
      R110=110,
      R150=150,
      R300=300,
      R600=600,
      R1200=1200,
      R2400=2400,
      R4800=4800,
      R9600=9600,
      R19200=19200,
      R38400=38400,
      R57600=57600,
      R76800=76800,
      R115200=115200
      };
      
      #endregion
      
      #endregion
      
      #region 定義方法
      
      /// <summary>
      /// 構(gòu)造函數(shù)
      /// </summary>
      public IbmsSerialPort()
      {
      portHandle = (IntPtr)0;
      
      _handleDataFunc = new HandleFunc(OnDllRecvData);
      }
      
      /// <summary>
      /// 打開串口
      /// </summary>
      /// <param name="nPort">串口號</param>
      /// <param name="nRate">波特率</param>
      /// /// <exception cref="ApplicationException">拋出應(yīng)用程序異常,包換錯誤描述</exception>
      public void Open(int nPort, StanderdRate nRate)
      {
      
      if(nPort > 255 || nPort < 0)
      {
      throw(new ArgumentOutOfRangeException());
      }
      
      port = nPort;
      rate = nRate;
      
      portHandle = Ibms_OpenPort( port, (int)rate );
      
      if( (IntPtr)0 == portHandle )
      {
      throw( new ApplicationException("打開串口失敗"));
      }
      
      //注冊函數(shù)指針
      Ibms_SetFuncHandle( portHandle, _handleDataFunc );
      
      openStatus = true;
      
      }
      
      /// <summary>
      /// 關(guān)閉串口
      /// </summary>
      public void Close()
      {
      if( openStatus )
      {
      Ibms_Close( portHandle);
      
      }
      
      openStatus = false;
      
      }
      
      /// <summary>
      /// 發(fā)送數(shù)據(jù)
      /// </summary>
      /// <param name="sendData">數(shù)據(jù)內(nèi)容</param>
      /// <exception cref="ApplicationException">拋出應(yīng)用程序異常,包換錯誤描述</exception>
      public void SendData( byte[] data )
      {
      if( !openStatus )
      {
      throw( new ApplicationException("串口沒有打開,發(fā)送數(shù)據(jù)失敗") );
      }
      
      if( !Ibms_SendData( portHandle, data, data.Length ) )
      {
      throw( new ApplicationException("串口發(fā)送數(shù)據(jù)失敗") );
      }
      }
      
      /// <summary>
      /// 處理接收到的串口數(shù)據(jù)
      /// </summary>
      /// <param name="pData">串口數(shù)據(jù)接收緩沖區(qū)首地址</param>
      /// <param name="nDataSize">數(shù)據(jù)大小,一般數(shù)據(jù)大小不超過2K</param>
      unsafe protected void OnDllRecvData(IntPtr pUnhandleData, int nDataSize)
      {
      int dataSize= nDataSize ;
      
      byte * pData =(byte *) pUnhandleData;
      
      byte[] data = new byte[dataSize];
      
      //復(fù)制數(shù)據(jù)到byte數(shù)組
      for(int i=0; i<dataSize; i++)
      {
      data[i]= pData[i];
      }
      
      //激發(fā)事件
      OnRecvData( this, new SPRecvDataArgs(data) );
      
      }
      
      #endregion
      
      #region 定義屬性
      
      /// <summary>
      /// 返回當(dāng)前的串口號
      /// </summary>
      public int Port
      {
      get
      {
      return port;
      }
      }
      
      /// <summary>
      /// 返回當(dāng)前串口的波特率
      /// </summary>
      public StanderdRate Rate
      {
      get
      {
      return
    posted on 2007-06-08 13:52 注銷..... 閱讀(422) 評論(0)  編輯  收藏 所屬分類: .net摘要
    主站蜘蛛池模板: 成人毛片免费视频| 免费电影在线观看网站| 日产国产精品亚洲系列| 亚洲中文无码亚洲人成影院| 成人免费观看一区二区| 亚洲视频在线观看免费视频| 久久久高清日本道免费观看| 亚洲av无码成人黄网站在线观看| 91在线视频免费观看| 亚洲精品无码午夜福利中文字幕| a级毛片免费播放| 亚洲妇熟XXXX妇色黄| 日韩人妻一区二区三区免费| 亚洲春色另类小说| 国产在线jyzzjyzz免费麻豆| 亚洲国产日韩精品| 精品免费国产一区二区三区 | 国产真人无遮挡作爱免费视频 | 国产亚洲精久久久久久无码AV| 一级毛片一级毛片免费毛片| 亚洲日韩精品A∨片无码| 免费国产成人午夜在线观看| 久久久久亚洲AV无码专区体验| 国产又黄又爽又猛免费app| 亚洲精品国产摄像头| 免费人成视网站在线观看不卡| 精品乱子伦一区二区三区高清免费播放 | 亚洲国产成人片在线观看| 一级毛片**不卡免费播| 亚洲日本va在线观看| 国产色爽女小说免费看| 99久久成人国产精品免费| 久久精品国产亚洲AV麻豆网站| 性做久久久久久久免费看| 99亚洲乱人伦aⅴ精品| 亚洲av午夜福利精品一区人妖| 91视频国产免费| 伊人久久国产免费观看视频| 夜夜亚洲天天久久| 日本特黄特黄刺激大片免费| 免费无码作爱视频|