You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
2.5 KiB
128 lines
2.5 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.IO.Ports;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SerialCommApp.SeriallLibs
|
|
{
|
|
public class PSerialComm
|
|
{
|
|
private readonly string CRLF = "\r\n";
|
|
|
|
private SerialPort _serialPort;
|
|
private string _stringBuffer;
|
|
|
|
private object _receiveLock = new object();
|
|
|
|
public event EventHandler<string> OnDataReceived;
|
|
|
|
public PMessageHistory<string> History { get; set; }
|
|
public PSerialCommSetting SerialCommSetting { get; set; }
|
|
|
|
public bool IsOpen { get { return _serialPort.IsOpen; } }
|
|
|
|
public string PortName
|
|
{
|
|
get
|
|
{
|
|
return _serialPort.PortName;
|
|
}
|
|
set
|
|
{
|
|
_serialPort.PortName = value;
|
|
}
|
|
}
|
|
|
|
public PSerialComm()
|
|
{
|
|
InitInstance();
|
|
}
|
|
|
|
public PSerialComm(string port)
|
|
{
|
|
InitInstance();
|
|
this.PortName = port;
|
|
}
|
|
|
|
private void InitInstance()
|
|
{
|
|
if (_serialPort != null)
|
|
_serialPort.Close();
|
|
|
|
_serialPort = new SerialPort();
|
|
_serialPort.DataReceived += SerialPort_DataReceived;
|
|
|
|
SerialCommSetting = new PSerialCommSetting();
|
|
|
|
this.History = new PMessageHistory<string>(10);
|
|
}
|
|
|
|
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
|
|
{
|
|
SerialPort serialPort = sender as SerialPort;
|
|
if (serialPort == null)
|
|
return;
|
|
|
|
string data = serialPort.ReadExisting();
|
|
if (data.Length < 1)
|
|
return;
|
|
|
|
HandleData(data);
|
|
}
|
|
|
|
public static string[] GetPortNames()
|
|
{
|
|
return SerialPort.GetPortNames();
|
|
}
|
|
|
|
public void Write(string message)
|
|
{
|
|
_serialPort.Write(message);
|
|
}
|
|
|
|
private void HandleData(string data)
|
|
{
|
|
_stringBuffer = string.Concat(_stringBuffer, data);
|
|
|
|
|
|
if (this.OnDataReceived == null)
|
|
return;
|
|
|
|
while (true)
|
|
{
|
|
int subStringIdx = _stringBuffer.IndexOf(CRLF);
|
|
if (subStringIdx < 0)
|
|
break;
|
|
|
|
string message = _stringBuffer.Substring(0, subStringIdx);
|
|
History.Add(message);
|
|
|
|
if (this.OnDataReceived != null)
|
|
this.OnDataReceived(this, message);
|
|
|
|
_stringBuffer = _stringBuffer.Remove(0, subStringIdx + CRLF.Length);
|
|
}
|
|
}
|
|
|
|
public void Open()
|
|
{
|
|
if (string.IsNullOrEmpty(this.PortName))
|
|
throw new Exception("Port name is cannot be empty.");
|
|
|
|
if (!_serialPort.IsOpen)
|
|
_serialPort.Open();
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
if (string.IsNullOrEmpty(this.PortName))
|
|
throw new Exception("Port name is cannot be empty.");
|
|
|
|
if (_serialPort.IsOpen)
|
|
_serialPort.Close();
|
|
}
|
|
}
|
|
}
|
|
|