using System; using System.Collections.Generic; using System.Text; using System.Threading; using Microsoft.VisualBasic; using System.IO.Ports; using CommonClassLib; namespace SimensSerialPort { /// /// Create by Richard.liu 2008 /// Simens PLC通讯类,RS232的自由口协议 /// public class CSimensSerialPort { SerialPort com; bool _ifInit; short _portNo; string _settings; /// /// 初始化PLC自由口协议通讯类 /// /// 计算机串口(COM口)号:1,2,3,4,5,6,7,8 /// 通讯设置:9600,None,8,One;分隔符使用全角“,” public CSimensSerialPort(short Portno, string Settings) { _portNo = Portno; _settings = Settings; com = new SerialPort(); } string _ComError; public string ComError { get { return _ComError; } set { _ComError = value; } } public bool InitCom() { try { if (com.IsOpen == true) { com.Close(); } com.PortName ="COM"+ _portNo.ToString(); char[] cc = new char[1] { ','}; string[] split = _settings.Split(cc); com.BaudRate =Convert.ToInt32( split[0]); com.Parity = Parity.None;//(Parity)Convert.ChangeType(split[1], typeof(Parity)); com.DataBits = Convert.ToInt32(split[2]); com.StopBits = StopBits.One;// (StopBits)Convert.ChangeType(split[3], typeof(StopBits)); com.Open(); _ifInit = true; return true; } catch (Exception ex) { _ComError = "通讯端口:" + _portNo + "初始化失败!" + ex.Message; return false; } } public byte[] ReadCom(short InBufCount) { if (_ifInit == false) InitCom(); int i = 0; try { do { i++; if (i > 5) break; Thread.Sleep(300); } while (com.BytesToRead < InBufCount); if (com.BytesToRead <= 0) { _ComError = "在串口输入缓冲区内没有要接收到的数据!"; return null; } byte[] inbyte = new byte[InBufCount]; com.Read(inbyte, 0, InBufCount); //CCarryConvert.WriteDarkCasket(this.ToString(), "Read", com.PortName, inbyte); return inbyte; } catch (Exception ex) { _ComError = ex.Message; return null; } } public string ReadCom() { if (_ifInit == false) InitCom(); try { string gets = com.ReadExisting(); //CCarryConvert.WriteDarkCasket(this.ToString(), "ReadExisting", com.PortName, gets); return gets; } catch (Exception ex) { _ComError = ex.Message; return null; } } public bool WriteCom(string wData) { if (_ifInit == false) InitCom(); try { com.Write( wData); //CCarryConvert.WriteDarkCasket(this.ToString(), "Write", com.PortName, wData); return true; } catch (Exception ex) { _ComError = "写串口缓冲区失败!" + ex.Message; return false; } } public bool WriteCom(byte[] wData) { if (_ifInit == false) InitCom(); try { //com.WriteBufferSize = 0; com.Write(wData, 0, wData.GetUpperBound(0)+1); //CCarryConvert.WriteDarkCasket(this.ToString(), "Write", com.PortName, wData); return true; } catch (Exception ex) { _ComError = "写串口缓冲区失败!" + ex.Message; return false; } } public void CloseCom() { if (com.IsOpen==true) com.Close(); } } }