利用C串口操作类实现异步数据接收_第1页
利用C串口操作类实现异步数据接收_第2页
利用C串口操作类实现异步数据接收_第3页
利用C串口操作类实现异步数据接收_第4页
利用C串口操作类实现异步数据接收_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/ C#异步数据接收串口操作类/ 串口串口接收到数据时,会产生一个事件。 / SPRecvDataArgs就是该事件的参数,参数中的RecvData包含接收到的数据。 / 使用方法: / public class SPRecvDataArgs:EventArgs / / 接收到的数据组成的字节数组 / private byte recvData; / / 构造函数,需要一个包含数据的byte作为初始化参数来实例化 SPRecvDataArgs / / 接收到的数据 public SPRecvDataArgs(byte recvData) if( recvData = null) throw(n

2、ew ArgumentNullException(); this.recvData = recvData; / / 返回接收到的数据内容 / public byte RecvData get return recvData; / / 封装动态链接库IbmsSerialPort.dll的功能,提供在.NET环境中异步 / 串口接收和发送功能。特别实现的是异步通过信号自动接收数据的模式。 / public class IbmsSerialPort:IDisposable #region 平台调用声明代码 / / 声明IbmsSerialPort.dll的Ibms_OpenPort函数 / / 串口

3、号 / 波特率 / DllImport("IbmsSerialPort.dll") public static extern IntPtr Ibms_OpenPort(int nPort, int nRate); / / 声明IbmsSerialPort.dll的Ibms_Close函数 / DllImport("IbmsSerialPort.dll") public static extern void Ibms_Close( IntPtr port); / / 声明IbmsSerialPort.dll的Ibms_SendData函数 / / / /

4、DllImport("IbmsSerialPort.dll") public static extern bool Ibms_SendData( IntPtr port, byte data,int nDataSize); / / 声明IbmsSerialPort.dll的Ibms_SetFuncHandle函数 / / DllImport("IbmsSerialPort.dll") public static extern void Ibms_SetFuncHandle( IntPtr port, HandleFunc handDataFunc); #

5、endregion #region 定义字段 / / 定义数据处理委托,作为API的函数指针传入动态链接库 / public delegate void HandleFunc(IntPtr pData, int nDataSize); / / 定义数据接收事件的原型 / public delegate void RecvData(object sender,SPRecvDataArgs e); / / 定义数据接收事件 / public event RecvData OnRecvData; / / 串口处理接收数据的委托 / private HandleFunc _handleDataFunc

6、; / / 串口的编号,从1开始的整数,最大255 / private int port; / / 串口所支持的波特率,必须是标准波特率之一 / private StanderdRate rate; / / 串口当前的打开状态 / private bool openStatus=false; / / 串口句柄 / private IntPtr portHandle; #region 定义标准的串口波特率 / / 标准的波特率 / 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 定义方法 / / 构造函数 / public IbmsSerialPort() portHandle = (IntPtr)0; _handleDataFunc = new HandleFunc(OnDllRecvData); / / 打开串口 / / 串口号 / 波特率 / / 抛出应用程序异常,包换

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("打开串口失败"); /注册函数指针 Ibms_Se

9、tFuncHandle( portHandle, _handleDataFunc ); openStatus = true; / / 关闭串口 / public void Close() if( openStatus ) Ibms_Close( portHandle); openStatus = false; / / 发送数据 / / 数据内容 / 抛出应用程序异常,包换错误描述 public void SendData( byte data ) if( !openStatus ) throw( new ApplicationException("串口没有打开,发送数据失败"

10、;) ); if( !Ibms_SendData( portHandle, data, data.Length ) ) throw( new ApplicationException("串口发送数据失败") ); / / 处理接收到的串口数据 / / 串口数据接收缓冲区首地址 / 数据大小,一般数据大小不超过2K unsafe protected void OnDllRecvData(IntPtr pUnhandleData, int nDataSize) int dataSize= nDataSize ; byte * pData =(byte *) pUnhandleD

11、ata; byte data = new bytedataSize; /复制数据到byte数组 for(int i=0; i datai= pDatai; /激发事件 OnRecvData( this, new SPRecvDataArgs(data) ); #endregion #region 定义属性 / / 返回当前的串口号 / public int Port get return port; / / 返回当前串口的波特率 / public StanderdRate Rate get return rate; / / 返回当前串口的状态 / public bool OpenStatus

12、get return openStatus; #endregion #region 非托管资源的及时释放 / / 因为包含了非托管的资源(占用系统串口),必须实现IDisposable接口 / 在使用完该类的时候,必须记得调用Dispose(),回收系统资源 / / / 方法1 / / SerialPort port =new SerialPort(); / . / /在try-catch-finaly的finaly中释放资源 / / port.Dispose(); / / / 方法2 / using( SerialPort port = new SerialPort() / / . / / 变量超出作用域时会自动调用其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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论