注銷

          注銷

            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 注銷..... 閱讀(426) 評論(0)  編輯  收藏 所屬分類: .net摘要
          主站蜘蛛池模板: 广安市| 甘谷县| 正定县| 巴彦淖尔市| 宿迁市| 延津县| 张家界市| 洱源县| 揭阳市| 靖西县| 桦甸市| 平罗县| 义马市| 庄河市| 泸溪县| 大城县| 渝中区| 融水| 新余市| 天柱县| 天镇县| 东阳市| 沾益县| 尼玛县| 墨江| 万荣县| 大连市| 平阳县| 禹州市| 铜鼓县| 高尔夫| 兴城市| 邮箱| 久治县| 澄迈县| 淮滨县| 鄂托克前旗| 阿城市| 博乐市| 新蔡县| 耿马|