VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#串口操作实用类

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  做工业通信有很长时间了,特别是串口(232/485),有VB/VC/C各种版本的串口操作代码,这些代码也经过了多年的现场考验,应该说是比较健壮的代码,但是目前却没有C#相对成熟的串口操作代码,最近用Moxa的设备开发基于WinCE5.0的串口操作代码,所以就扩充完善了一下串口操作,特别是SendCommand函数,这是我比较常用的主从通信代码,不喜欢用事件或线程接数据,在规定的超时时间内直接循环判断要接收的数据。

  下面是具体的代码:  

  publicclassPortData
  {
  publiceventPortDataReceivedEventHandleReceived;
  publiceventSerialErrorReceivedEventHandlerError;
  publicSerialPortport;
  publicboolReceiveEventFlag=false; //接收事件是否有效false表示有效
  publicPortData(stringsPortName,intbaudrate,Parityparity,SerialInterface.SerialModemode)
  {
  port=newSerialPort(sPortName,baudrate,parity,8,StopBits.One);
  port.RtsEnable=true;
  port.ReadTimeout=3000;
  port.DataReceived+=newSerialDataReceivedEventHandler(DataReceived);
  port.ErrorReceived+=newSerialErrorReceivedEventHandler(ErrorEvent);
  }
  ~PortData()
  {
  Close();
  }
  publicvoidOpen()
  {
  if(!port.IsOpen)
  {     
  port.Open();
  }
  }
  publicvoidClose()
  {
  if(port.IsOpen)
  {
  port.Close();
  }
  }
  //数据发送
  publicvoidSendData(byte[]data)
  {
  if(port.IsOpen)
  {
  port.Write(data,0,data.Length);
  }
  }
  publicvoidSendData(byte[]data,intoffset,intcount)
  {
  if(port.IsOpen)
  {
  port.Write(data,offset,count);
  }
  }
  //发送命令
  publicintSendCommand(byte[]SendData,ref byte[]ReceiveData,intOvertime)
  {
  if(port.IsOpen)
  {
  ReceiveEventFlag=true;    //关闭接收事件
  port.DiscardInBuffer();    //清空接收缓冲区        
  port.Write(SendData,0,SendData.Length);
  intnum=0,ret=0;
  while(num++<Overtime)
  {
  if(port.BytesToRead>=ReceiveData.Length)break;
  System.Threading.Thread.Sleep(1);
  }
  if(port.BytesToRead>=ReceiveData.Length)
  ret=port.Read(ReceiveData,0,ReceiveData.Length);
  ReceiveEventFlag=false;   //打开事件
  returnret;
  }
  return-1;
  }
  publicvoidErrorEvent(objectsender,SerialErrorReceivedEventArgse)
  {
  if(Error!=null)Error(sender,e);
  }
  //数据接收
  publicvoidDataReceived(objectsender,SerialDataReceivedEventArgse)
  {
  //禁止接收事件时直接退出
  if(ReceiveEventFlag)return;
  byte[]data=newbyte[port.BytesToRead];
  port.Read(data,0,data.Length);
  if(Received!=null)Received(sender,newPortDataReciveEventArgs(data));
  }
  publicboolIsOpen()
  {
  returnport.IsOpen;
  }
  }
  publicdelegatevoidPortDataReceivedEventHandle(objectsender,PortDataReciveEventArgse);
  publicclassPortDataReciveEventArgs:EventArgs
  {
  publicPortDataReciveEventArgs()
  {
  this.data=null;
  }
  publicPortDataReciveEventArgs(byte[]data)
  {
  this.data=data;
  }
  privatebyte[]data;
  publicbyte[]Data
  {
  get{returndata;}
  set{data=value;}
  }
  }

  【附注】1~9 串口的名称是 "COMx:",>9的以前用.COMx:比较好使,但是在moxa 661设备上却不行,要用如下格式"$deviceCOM" + PortNo.ToString() + "",也许这是moxa修改了相应的串口驱动。



相关教程