<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摘要
    主站蜘蛛池模板: 久久久久免费视频| 亚洲乱码日产精品a级毛片久久| 一级毛片**免费看试看20分钟| 亚洲日本国产精华液| 亚洲最大AV网站在线观看| 日韩毛片无码永久免费看| 国产精品久久永久免费| 182tv免费视频在线观看| 免费无码专区毛片高潮喷水| 亚洲午夜在线播放| 亚洲视频一区二区在线观看| 亚洲熟妇丰满多毛XXXX| 亚洲精品无码激情AV| 国产无遮挡又黄又爽免费视频| free哆啪啪免费永久| 三年片在线观看免费观看大全动漫 | 国产精品无码素人福利免费| 免费阿v网站在线观看g| 国产精品99久久免费观看| 久久久久久久久久久免费精品| 噜噜噜亚洲色成人网站| 亚洲AV成人精品日韩一区| 亚洲精品综合在线影院| 亚洲人成小说网站色| 亚洲人成电影在线观看青青| 内射干少妇亚洲69XXX| 亚洲小视频在线观看| 亚洲高清视频在线观看| 久久亚洲一区二区| 亚洲精品高清视频| 久久精品国产亚洲av麻豆色欲| 久久亚洲AV午夜福利精品一区| 亚洲国产精品va在线播放| 中文亚洲AV片在线观看不卡 | 国产亚洲人成在线影院| 亚洲A∨精品一区二区三区下载| 亚洲av永久无码| 美女被免费视频网站a| 精品免费AV一区二区三区| 天堂亚洲免费视频| 久久久精品国产亚洲成人满18免费网站|