using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
namespace Mesnac.Communication
{
///
/// 串口通讯服务类
///
public class SerialPortService
{
#region 单例实现
private static SerialPortService instance = null;
private Dictionary _dicSerialPort = null; //保存串口对象的集合
private SerialPortService()
{
if (this._dicSerialPort == null)
{
this._dicSerialPort = new Dictionary();
}
}
public static SerialPortService Instance
{
get
{
if (instance == null)
{
instance = new SerialPortService();
}
return instance;
}
}
#endregion
#region 获取串口对象
///
/// 获取串口对象
///
/// 串口名称
/// 波特率
/// 返可用的串口对象
public SerialPort GetSerialPort(string portName, int baudRate)
{
SerialPort currSerialPort = null;
foreach (SerialPort sp in this._dicSerialPort.Values)
{
if (sp.PortName == portName && sp.BaudRate == baudRate)
{
currSerialPort = sp;
break;
}
}
if (currSerialPort == null)
{
currSerialPort = new SerialPort();
currSerialPort.PortName = portName;
currSerialPort.BaudRate = baudRate;
currSerialPort.Encoding = System.Text.Encoding.Default;
this._dicSerialPort.Add(currSerialPort.GetHashCode(), currSerialPort);
}
try
{
if (currSerialPort.IsOpen)
{
currSerialPort.Close();
currSerialPort.Open();
}
else
{
currSerialPort.Open();
}
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Warn(String.Format("串口{0}关闭或打开失败,重新创建串口对象!", portName));
this._dicSerialPort.Remove(currSerialPort.GetHashCode());
currSerialPort = new SerialPort();
currSerialPort.PortName = portName;
currSerialPort.BaudRate = baudRate;
currSerialPort.Encoding = System.Text.Encoding.Default;
this._dicSerialPort.Add(currSerialPort.GetHashCode(), currSerialPort);
currSerialPort.Open();
}
return currSerialPort;
}
#endregion
}
}