using System;
|
using System.Collections.Generic;
|
using System.IO.Ports;
|
using System.Linq;
|
using System.Net;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
using HslCommunication;
|
using HslCommunication.LogNet;
|
|
namespace WIDESEAWCS_Communicator
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public class SerialPortCommunicator : BaseSerialPortCommunicator
|
{
|
/// <summary>
|
/// 当前通讯器是否已连接到PLC。
|
/// </summary>
|
private bool _connected;
|
|
/// <summary>
|
/// PLC名称
|
/// </summary>
|
private string _name;
|
|
private ILogNet _logNet;
|
|
private List<byte> _buffers = new List<byte>();
|
|
private string _serialPortName;
|
|
private SerialPort _serialPort;
|
|
private int _readCount;
|
|
private bool _isReadToEnd;
|
|
|
/// <summary>
|
/// 日志记录器
|
/// </summary>
|
public override ILogNet LogNet => _logNet;
|
|
/// <summary>
|
/// 通讯器名称
|
/// </summary>
|
public override string Name => _name;
|
|
/// <summary>
|
/// 当前通讯器是否已连接到PLC。
|
/// </summary>
|
public override bool IsConnected => _connected;
|
|
/// <summary>
|
/// 缓冲区
|
/// </summary>
|
public override List<byte> Buffers => _buffers;
|
|
/// <summary>
|
/// 串口名称
|
/// </summary>
|
public override string SerialPortName => _serialPortName;
|
|
/// <summary>
|
/// 读取数据的长度。
|
/// </summary>
|
public override int ReadCount => _readCount;
|
|
/// <summary>
|
/// 读取数据时是否读取到数据末尾。
|
/// </summary>
|
public override bool IsReadToEnd => _isReadToEnd;
|
|
/// <summary>
|
///
|
/// </summary>
|
public override SerialPort SerialPort { get { return _serialPort; } set { _serialPort = value; } }
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
public SerialPortCommunicator(string serialPortName, int port, string name)
|
{
|
string path = AppDomain.CurrentDomain.BaseDirectory + $"Log_PLCReadWrite\\{name}";
|
_logNet = new LogNetFileSize(path, 10 * 1024 * 1024, 100);
|
_serialPortName = serialPortName;
|
_name = name;
|
_serialPort = new SerialPort(serialPortName);
|
_serialPort.DataReceived += DataReceived;
|
}
|
|
private void DataReceived(object sender, SerialDataReceivedEventArgs e)
|
{
|
try
|
{
|
_buffers.Clear();
|
_buffers = new List<byte>();
|
byte[] data = new byte[1024];
|
while (true)
|
{
|
if (_serialPort.BytesToRead < 1)
|
break;
|
|
if (_serialPort.BytesToRead > data.Length)
|
{
|
_isReadToEnd = false;
|
}
|
else
|
{
|
_isReadToEnd = true;
|
}
|
|
_readCount = _serialPort.Read(data, 0, Math.Min(_serialPort.BytesToRead, data.Length));
|
|
_buffers.AddRange(data.SelectBegin(_readCount));
|
}
|
}
|
catch (Exception ex)
|
{
|
|
}
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <returns></returns>
|
/// <exception cref="NotImplementedException"></exception>
|
public override bool Connect()
|
{
|
try
|
{
|
_serialPort.Open();
|
return true;
|
}
|
catch (Exception ex)
|
{
|
LogNet.WriteException(Name, $"串口打开失败,串口号:{_serialPortName}", ex);
|
//连接异常时抛出自定义异常类
|
throw new CommunicationException(ex.Message, CommunicationErrorType.ConnectionFailed, innerException: ex);
|
}
|
}
|
|
/// <summary>
|
/// 断开与工业设备的连接。
|
/// </summary>
|
/// <returns></returns>
|
/// <exception cref="NotImplementedException"></exception>
|
public override bool Disconnect()
|
{
|
try
|
{
|
_serialPort.Close();
|
return true;
|
}
|
catch (Exception ex)
|
{
|
LogNet.WriteException(Name, $"串口关闭失败,串口号:{_serialPortName}", ex);
|
//连接异常时抛出自定义异常类
|
throw new CommunicationException(ex.Message, CommunicationErrorType.ConnectionFailed, innerException: ex);
|
}
|
}
|
|
/// <summary>
|
/// 释放资源。
|
/// </summary>
|
/// <exception cref="NotImplementedException"></exception>
|
public override void Dispose()
|
{
|
Disconnect();
|
GC.SuppressFinalize(this);
|
}
|
|
/// <summary>
|
/// 将缓冲区中的数据转换为字符串
|
/// </summary>
|
/// <param name="encoding"></param>
|
/// <returns></returns>
|
public override string ToString(Encoding encoding)
|
{
|
try
|
{
|
return encoding.GetString(Buffers.ToArray());
|
}
|
catch (Exception ex)
|
{
|
return "";
|
}
|
}
|
|
/// <summary>
|
/// 发送数据
|
/// </summary>
|
public override void Write(byte[] data)
|
{
|
_serialPort.Write(data, 0, data.Length);
|
}
|
|
/// <summary>
|
/// 发送数据
|
/// </summary>
|
/// <param name="data"></param>
|
public override void Write(string data)
|
{
|
byte[] bytes = Encoding.UTF8.GetBytes(data);
|
|
_serialPort.Write(bytes, 0, bytes.Length);
|
}
|
|
/// <summary>
|
/// 发送数据
|
/// </summary>
|
/// <param name="data"></param>
|
/// <param name="endStr"></param>
|
public override void Write(string data, string endStr)
|
{
|
byte[] bytes = Encoding.UTF8.GetBytes(data + endStr);
|
|
_serialPort.Write(bytes, 0, bytes.Length);
|
}
|
}
|
}
|