using System;
|
using System.IO.Ports;
|
using System.Linq;
|
|
namespace XImaging.Automation.Library.HxDriverLib
|
{
|
public class SerialHelper
|
{
|
private object m_wLock = new Object();
|
private object m_rLock = new Object();
|
private SerialPort serialPort;
|
|
public string PortName
|
{
|
get
|
{
|
return serialPort.PortName;
|
}
|
}
|
|
private SerialHelper(string port, int baudrate,
|
int databits,
|
StopBits stopbits,
|
Parity parity)
|
{
|
serialPort = new SerialPort();
|
|
serialPort.PortName = port;
|
serialPort.BaudRate = baudrate;
|
serialPort.DataBits = databits;
|
serialPort.StopBits = stopbits;
|
serialPort.Parity = parity;
|
serialPort.ReadTimeout = 1000;
|
}
|
|
public static SerialHelper Create(string port, int baudrate,
|
int databits=8,
|
StopBits stopbits = System.IO.Ports.StopBits.One,
|
Parity parity = System.IO.Ports.Parity.None)
|
{
|
return new SerialHelper(port, baudrate, databits, stopbits, parity);
|
}
|
|
public bool Open()
|
{
|
try
|
{
|
if (!IsOpen)
|
{
|
serialPort.Open();
|
}
|
return true;
|
}
|
catch (UnauthorizedAccessException uex)
|
{
|
LogConstant.logger.Print(string.Format("无法打开串口连接-证权限错误:{0}", uex.ToString()));
|
return false;
|
}
|
catch (System.IO.IOException iex)
|
{
|
LogConstant.logger.Print(string.Format("无法打开串口连接-IO通信错误:{0}", iex.ToString()));
|
return false;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print(string.Format("无法打开串口连接:{0}", ex.ToString()));
|
return false;
|
}
|
}
|
|
public void Close()
|
{
|
if (IsOpen)
|
{
|
serialPort.Close();
|
}
|
}
|
|
public bool IsOpen
|
{
|
get
|
{
|
return serialPort.IsOpen;
|
}
|
}
|
|
public void Write(string command, bool hex=false, char sep=' ')
|
{
|
lock (m_wLock)
|
{
|
try
|
{
|
if (hex)
|
{
|
byte[] b = command.Split(sep).AsParallel().Select(x => Convert.ToByte(x, 16)).ToArray();
|
serialPort.Write(b, 0, b.Length);
|
}
|
else
|
{
|
serialPort.Write(command);
|
}
|
}
|
catch (TimeoutException tex)
|
{
|
LogConstant.logger.Print(string.Format("串口通信超时:{0}", tex.ToString()));
|
throw tex;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print(ex.ToString());
|
throw ex;
|
}
|
}
|
}
|
|
public void Write(byte[] command, int offset, int length)
|
{
|
lock (m_wLock)
|
{
|
try
|
{
|
serialPort.Write(command, offset, length);
|
}
|
catch (TimeoutException tex)
|
{
|
LogConstant.logger.Print(string.Format("串口通信超时:{0}", tex.ToString()));
|
throw tex;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print(ex.ToString());
|
throw ex;
|
}
|
}
|
}
|
|
public string Read()
|
{
|
lock (m_rLock)
|
{
|
try
|
{
|
var response = serialPort.ReadLine();
|
return response;
|
}
|
catch (TimeoutException tex)
|
{
|
LogConstant.logger.Print(string.Format("串口通信超时:{0}", tex.ToString()));
|
throw tex;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print(ex.ToString());
|
throw ex;
|
}
|
}
|
}
|
|
public void Read(byte[] b, int offset, int count)
|
{
|
lock (m_rLock)
|
{
|
try
|
{
|
this.serialPort.Read(b, offset, count);
|
}
|
catch (TimeoutException tex)
|
{
|
LogConstant.logger.Print(string.Format("串口通信超时:{0}", tex.ToString()));
|
throw tex;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print(ex.ToString());
|
throw ex;
|
}
|
}
|
}
|
|
public int ReadByte()
|
{
|
lock (m_rLock)
|
{
|
try
|
{
|
int b = this.serialPort.ReadByte();
|
return b;
|
}
|
catch (TimeoutException tex)
|
{
|
LogConstant.logger.Print(string.Format("串口通信超时:{0}", tex.ToString()));
|
throw tex;
|
}
|
catch (Exception ex)
|
{
|
LogConstant.logger.Print(ex.ToString());
|
throw ex;
|
}
|
}
|
}
|
}
|
}
|