




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、/ C#異步數(shù)據(jù)接收串口操作類/ 串口串口接收到數(shù)據(jù)時,會產(chǎn)生一個事件。 / SPRecvDataArgs就是該事件的參數(shù),參數(shù)中的RecvData包含接收到的數(shù)據(jù)。 / 使用方法: / public class SPRecvDataArgs:EventArgs / / 接收到的數(shù)據(jù)組成的字節(jié)數(shù)組 / private byte recvData; / / 構(gòu)造函數(shù),需要一個包含數(shù)據(jù)的byte作為初始化參數(shù)來實(shí)例化 SPRecvDataArgs / / 接收到的數(shù)據(jù) public SPRecvDataArgs(byte recvData) if( recvData = null) throw(n
2、ew ArgumentNullException(); this.recvData = recvData; / / 返回接收到的數(shù)據(jù)內(nèi)容 / public byte RecvData get return recvData; / / 封裝動態(tài)鏈接庫IbmsSerialPort.dll的功能,提供在.NET環(huán)境中異步 / 串口接收和發(fā)送功能。特別實(shí)現(xiàn)的是異步通過信號自動接收數(shù)據(jù)的模式。 / public class IbmsSerialPort:IDisposable #region 平臺調(diào)用聲明代碼 / / 聲明IbmsSerialPort.dll的Ibms_OpenPort函數(shù) / / 串口
3、號 / 波特率 / DllImport("IbmsSerialPort.dll") public static extern IntPtr Ibms_OpenPort(int nPort, int nRate); / / 聲明IbmsSerialPort.dll的Ibms_Close函數(shù) / DllImport("IbmsSerialPort.dll") public static extern void Ibms_Close( IntPtr port); / / 聲明IbmsSerialPort.dll的Ibms_SendData函數(shù) / / / /
4、DllImport("IbmsSerialPort.dll") public static extern bool Ibms_SendData( IntPtr port, byte data,int nDataSize); / / 聲明IbmsSerialPort.dll的Ibms_SetFuncHandle函數(shù) / / DllImport("IbmsSerialPort.dll") public static extern void Ibms_SetFuncHandle( IntPtr port, HandleFunc handDataFunc); #
5、endregion #region 定義字段 / / 定義數(shù)據(jù)處理委托,作為API的函數(shù)指針傳入動態(tài)鏈接庫 / public delegate void HandleFunc(IntPtr pData, int nDataSize); / / 定義數(shù)據(jù)接收事件的原型 / public delegate void RecvData(object sender,SPRecvDataArgs e); / / 定義數(shù)據(jù)接收事件 / public event RecvData OnRecvData; / / 串口處理接收數(shù)據(jù)的委托 / private HandleFunc _handleDataFunc
6、; / / 串口的編號,從1開始的整數(shù),最大255 / private int port; / / 串口所支持的波特率,必須是標(biāo)準(zhǔn)波特率之一 / private StanderdRate rate; / / 串口當(dāng)前的打開狀態(tài) / private bool openStatus=false; / / 串口句柄 / private IntPtr portHandle; #region 定義標(biāo)準(zhǔn)的串口波特率 / / 標(biāo)準(zhǔn)的波特率 / public enum StanderdRate R50=50, R75=75, R110=110, R150=150, R300=300, R600=600, R1
7、200=1200, R2400=2400, R4800=4800, R9600=9600, R19200=19200, R38400=38400, R57600=57600, R76800=76800, R115200=115200 ; #endregion #endregion #region 定義方法 / / 構(gòu)造函數(shù) / public IbmsSerialPort() portHandle = (IntPtr)0; _handleDataFunc = new HandleFunc(OnDllRecvData); / / 打開串口 / / 串口號 / 波特率 / / 拋出應(yīng)用程序異常,包換
8、錯誤描述 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_Se
9、tFuncHandle( portHandle, _handleDataFunc ); openStatus = true; / / 關(guān)閉串口 / public void Close() if( openStatus ) Ibms_Close( portHandle); openStatus = false; / / 發(fā)送數(shù)據(jù) / / 數(shù)據(jù)內(nèi)容 / 拋出應(yīng)用程序異常,包換錯誤描述 public void SendData( byte data ) if( !openStatus ) throw( new ApplicationException("串口沒有打開,發(fā)送數(shù)據(jù)失敗"
10、;) ); if( !Ibms_SendData( portHandle, data, data.Length ) ) throw( new ApplicationException("串口發(fā)送數(shù)據(jù)失敗") ); / / 處理接收到的串口數(shù)據(jù) / / 串口數(shù)據(jù)接收緩沖區(qū)首地址 / 數(shù)據(jù)大小,一般數(shù)據(jù)大小不超過2K unsafe protected void OnDllRecvData(IntPtr pUnhandleData, int nDataSize) int dataSize= nDataSize ; byte * pData =(byte *) pUnhandleD
11、ata; byte data = new bytedataSize; /復(fù)制數(shù)據(jù)到byte數(shù)組 for(int i=0; i datai= pDatai; /激發(fā)事件 OnRecvData( this, new SPRecvDataArgs(data) ); #endregion #region 定義屬性 / / 返回當(dāng)前的串口號 / public int Port get return port; / / 返回當(dāng)前串口的波特率 / public StanderdRate Rate get return rate; / / 返回當(dāng)前串口的狀態(tài) / public bool OpenStatus
12、get return openStatus; #endregion #region 非托管資源的及時釋放 / / 因為包含了非托管的資源(占用系統(tǒng)串口),必須實(shí)現(xiàn)IDisposable接口 / 在使用完該類的時候,必須記得調(diào)用Dispose(),回收系統(tǒng)資源 / / / 方法1 / / SerialPort port =new SerialPort(); / . / /在try-catch-finaly的finaly中釋放資源 / / port.Dispose(); / / / 方法2 / using( SerialPort port = new SerialPort() / / . / / 變量超出作用域時會自動調(diào)用其Dispose()方法 / / / IbmsSerialPort() Dispose( false ); protected virtual void Dispose( bool disposing ) if( disposing ) /清理托管的對象 /清理非托管的資源 Close(); #region IDisposable 成員 public
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 風(fēng)電技能培訓(xùn)課件圖片高清
- 青年群體游戲?qū)嵺`的媒介儀式建構(gòu)研究
- 含苯并咪唑結(jié)構(gòu)熱固性聚酰亞胺的制備與性能研究
- 第九版外科腫瘤免疫治療臨床指南解讀
- 急救護(hù)理筆記方法教程
- 神經(jīng)炎護(hù)理常規(guī)
- 腦出血術(shù)后護(hù)理診斷及護(hù)理措施
- 管理學(xué)人事任免案例
- 全麻疝氣健康宣教
- 顱腦CT檢查技術(shù)課件
- 糖尿病酮癥酸中毒疑難病例護(hù)理
- 2025年詩詞大賽考試指導(dǎo)題庫300題(含答案)
- 居民生活垃圾轉(zhuǎn)運(yùn)投標(biāo)方案(技術(shù)方案)
- 《智慧園藝》課程教學(xué)大綱
- 2025年上半年工作總結(jié)及下半年工作計劃簡單版(2篇)
- 企業(yè)道路交通安全宣傳
- 635MPa級熱軋帶肋高強(qiáng)鋼筋應(yīng)用技術(shù)規(guī)程
- 中?!峨姽せA(chǔ)》課程標(biāo)準(zhǔn)
- 他汀不耐受的臨床診斷與處理中國專家共識(2024)解讀課件
- 2024年7月國家開放大學(xué)法學(xué)本科《知識產(chǎn)權(quán)法》期末考試試題及答案
- 2024移動金融客戶端應(yīng)用軟件安全管理規(guī)范標(biāo)準(zhǔn)
評論
0/150
提交評論