using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; namespace Aitex.Core.RT.Communication { public class RS232 { public string ErrorString { get; set; } public string PortName { get { return m_Port.PortName; } } protected SerialPort m_Port = new SerialPort(); public RS232(string name, int baudRate, int dataBits, Parity parity = Parity.None, StopBits stopBits = StopBits.One) { m_Port.PortName = name; m_Port.BaudRate = baudRate; m_Port.DataBits = dataBits; m_Port.Parity = parity; m_Port.StopBits = stopBits; m_Port.RtsEnable = false; m_Port.DtrEnable = false; m_Port.ReadTimeout = 2000; m_Port.WriteTimeout = 1000; m_Port.NewLine = "\r\n"; m_Port.Handshake = Handshake.None; } ~RS232() { Close(); } public bool Open() { if (m_Port.IsOpen) { ErrorString = m_Port.PortName + " already opened"; return false; } try { m_Port.Open(); m_Port.DiscardInBuffer(); m_Port.DiscardOutBuffer(); } catch (Exception e) { ErrorString = m_Port.PortName + " 端口无法打开,请检查配置文件端口号的设置。" + e.Message; return false; } ErrorString = m_Port.PortName + "opened successfully"; return true; } public bool IsOpen() { return m_Port.IsOpen; } public bool Close() { if (m_Port.IsOpen) { try { m_Port.Close(); } catch (Exception e) { ErrorString = m_Port.PortName + " 端口无法关闭。" + e.Message; return false; } } ErrorString = m_Port.PortName + "Closed Successfully"; return true; } public void WriteBytes(byte[] bytes) { try { m_Port.Write(bytes, 0, bytes.Length); } catch (Exception e) { ErrorString = m_Port.PortName + " write error :" + e.Message; throw (e); } } public void ClearPortBuffer() { m_Port.DiscardInBuffer(); m_Port.DiscardOutBuffer(); } public bool ReadByte(ref byte value) { bool ret = true; value = 0; try { value = (byte)m_Port.ReadByte(); } catch (TimeoutException) { ret = false; } catch (Exception e) { ErrorString = m_Port.PortName + " read error :" + e.Message; throw (e); } return ret; } } }