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

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

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

    注銷

    注銷

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      112 隨筆 :: 7 文章 :: 18 評論 :: 0 Trackbacks
     使用C#調用傳統32位API實現串口操作,整個結構特別的簡單。接收數據只需要定義數據接收事件即可。
      
      上傳源代碼我不會,需要源代碼的請與我(dyj057@gmail.com)聯系。你也可以教我怎么上傳源代碼。
      
      using System;
      using System.Runtime.InteropServices;
      
      /// <summary>
      /// (C)2003-2005 C2217 Studio 保留所有權利
      ///
      /// 文件名稱:   IbmsSerialPort.cs
      /// 文件ID:
      /// 文件說明:
      ///     封裝動態鏈接庫IbmsSerialPort.dll的功能,提供在.NET環境中
      ///     串口異步接收和發送數據的功能。
      ///
      /// 當前版本:  1.0
      ///
      /// 作者:  鄧楊均
      /// 創建日期:  2005-2-2
      /// 最后修改日期: 2005-2-2
      ///
      /// 歷史修改記錄:
      ///
      /// </summary>
      
      namespace Ibms.Tool.IO
      {
      
      /// <summary>
      /// 當串口接收到數據時,會產生一個事件。
      /// SPRecvDataArgs就是該事件的參數,參數中的RecvData包含接收到的數據。
      /// 使用方法:
      /// </summary>
      public class SPRecvDataArgs:EventArgs
      {
      /// <summary>
      /// 接收到的數據組成的字節數組
      /// </summary>
      private byte[] recvData;
      
      /// <summary>
      /// 構造函數,需要一個包含數據的byte[]作為初始化參數來實例化 SPRecvDataArgs
      /// </summary>
      /// <param name="recvData">接收到的數據</param>
      public SPRecvDataArgs(byte[] recvData)
      {
      if( recvData == null)
      {
      throw(new ArgumentNullException());
      }
      
      this.recvData = recvData;
      }
      
      /// <summary>
      /// 返回接收到的數據內容
      /// </summary>
      public byte[] RecvData
      {
      get
      {
      return recvData;
      }
      }
      }
      
      /// <summary>
      /// 封裝動態鏈接庫IbmsSerialPort.dll的功能,提供在.NET環境中異步
      /// 串口接收和發送功能。特別實現的是異步通過信號自動接收數據的模式。
      /// </summary>
      public class IbmsSerialPort:IDisposable
      {
      
      #region 平臺調用聲明代碼
      
      /// <summary>
      /// 聲明IbmsSerialPort.dll的Ibms_OpenPort函數
      /// </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函數
      /// </summary>
      [DllImport("IbmsSerialPort.dll")]
      public static extern void Ibms_Close( IntPtr port);
      
      /// <summary>
      /// 聲明IbmsSerialPort.dll的Ibms_SendData函數
      /// </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函數
      /// </summary>
      /// <param name="handDataFunc"></param>
      [DllImport("IbmsSerialPort.dll")]
      public static extern void Ibms_SetFuncHandle( IntPtr port, HandleFunc handDataFunc);
      
      #endregion
      
      #region 定義字段
      
      /// <summary>
      /// 定義數據處理委托,作為API的函數指針傳入動態鏈接庫
      /// </summary>
      public delegate void HandleFunc(IntPtr pData, int nDataSize);
      
      /// <summary>
      /// 定義數據接收事件的原型
      /// </summary>
      public delegate void RecvData(object sender,SPRecvDataArgs e);
      
      /// <summary>
      /// 定義數據接收事件
      /// </summary>
      public event RecvData OnRecvData;
      
      /// <summary>
      /// 串口處理接收數據的委托
      /// </summary>
      private HandleFunc _handleDataFunc;
      
      /// <summary>
      /// 串口的編號,從1開始的整數,最大255
      /// </summary>
      private int port;
      
      /// <summary>
      /// 串口所支持的波特率,必須是標準波特率之一
      /// </summary>
      private StanderdRate rate;
      
      /// <summary>
      /// 串口當前的打開狀態
      /// </summary>
      private bool openStatus=false;
      
      /// <summary>
      /// 串口句柄
      /// </summary>
      private IntPtr portHandle;
      
      #region 定義標準的串口波特率
      
      /// <summary>
      /// 標準的波特率
      /// </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>
      /// 構造函數
      /// </summary>
      public IbmsSerialPort()
      {
      portHandle = (IntPtr)0;
      
      _handleDataFunc = new HandleFunc(OnDllRecvData);
      }
      
      /// <summary>
      /// 打開串口
      /// </summary>
      /// <param name="nPort">串口號</param>
      /// <param name="nRate">波特率</param>
      /// /// <exception cref="ApplicationException">拋出應用程序異常,包換錯誤描述</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("打開串口失敗"));
      }
      
      //注冊函數指針
      Ibms_SetFuncHandle( portHandle, _handleDataFunc );
      
      openStatus = true;
      
      }
      
      /// <summary>
      /// 關閉串口
      /// </summary>
      public void Close()
      {
      if( openStatus )
      {
      Ibms_Close( portHandle);
      
      }
      
      openStatus = false;
      
      }
      
      /// <summary>
      /// 發送數據
      /// </summary>
      /// <param name="sendData">數據內容</param>
      /// <exception cref="ApplicationException">拋出應用程序異常,包換錯誤描述</exception>
      public void SendData( byte[] data )
      {
      if( !openStatus )
      {
      throw( new ApplicationException("串口沒有打開,發送數據失敗") );
      }
      
      if( !Ibms_SendData( portHandle, data, data.Length ) )
      {
      throw( new ApplicationException("串口發送數據失敗") );
      }
      }
      
      /// <summary>
      /// 處理接收到的串口數據
      /// </summary>
      /// <param name="pData">串口數據接收緩沖區首地址</param>
      /// <param name="nDataSize">數據大小,一般數據大小不超過2K</param>
      unsafe protected void OnDllRecvData(IntPtr pUnhandleData, int nDataSize)
      {
      int dataSize= nDataSize ;
      
      byte * pData =(byte *) pUnhandleData;
      
      byte[] data = new byte[dataSize];
      
      //復制數據到byte數組
      for(int i=0; i<dataSize; i++)
      {
      data[i]= pData[i];
      }
      
      //激發事件
      OnRecvData( this, new SPRecvDataArgs(data) );
      
      }
      
      #endregion
      
      #region 定義屬性
      
      /// <summary>
      /// 返回當前的串口號
      /// </summary>
      public int Port
      {
      get
      {
      return port;
      }
      }
      
      /// <summary>
      /// 返回當前串口的波特率
      /// </summary>
      public StanderdRate Rate
      {
      get
      {
      return
    posted on 2007-06-08 13:52 注銷..... 閱讀(422) 評論(0)  編輯  收藏 所屬分類: .net摘要
    主站蜘蛛池模板: 精品亚洲AV无码一区二区| 亚洲不卡中文字幕无码| 国产午夜亚洲精品国产| 最好看最新的中文字幕免费| 亚洲AV人无码综合在线观看| 特级精品毛片免费观看| 亚洲国产精品自在线一区二区| 最新亚洲成av人免费看| 国产亚洲综合色就色| 久爱免费观看在线网站| 久久亚洲美女精品国产精品 | 亚洲免费二区三区| 亚洲综合无码一区二区三区| 亚洲免费在线观看视频| 亚洲色成人WWW永久在线观看| 日本高清免费aaaaa大片视频| 香蕉视频免费在线| 国产亚洲无线码一区二区 | 色偷偷尼玛图亚洲综合| 亚洲国产精品日韩| 免费高清国产视频| 亚洲国产综合在线| 全免费a级毛片免费看无码| 爱情岛论坛免费视频| 好看的亚洲黄色经典| 韩国免费一级成人毛片| 日韩亚洲人成在线综合| 亚洲日韩精品无码专区网址| 91香蕉在线观看免费高清| 国产亚洲玖玖玖在线观看| 亚洲综合另类小说色区色噜噜| 久久久久久影院久久久久免费精品国产小说 | 亚洲精品中文字幕无乱码麻豆| 在线视频免费观看www动漫| 午夜免费国产体验区免费的| 亚洲av永久无码精品古装片 | 国产精一品亚洲二区在线播放| 免费精品国产自产拍在| 一级做性色a爰片久久毛片免费| 亚洲美女视频网站| 亚洲精品无码专区2|