dc2a24ad25
Extracted the serial port into it's own class and created a simpler command processing mechanism.
139 lines
3.3 KiB
C#
139 lines
3.3 KiB
C#
using System;
|
|
using System.IO.Ports;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading;
|
|
|
|
namespace ASCOM.MeadeAutostar497.Controller
|
|
{
|
|
[ComVisible(false)]
|
|
public interface ISerialProcessor
|
|
{
|
|
bool IsOpen { get; }
|
|
bool DtrEnable { get; set; }
|
|
bool RtsEnable { get; set; }
|
|
int BaudRate { get; set; }
|
|
int DataBits { get; set; }
|
|
StopBits StopBits { get; set; }
|
|
Parity Parity { get; set; }
|
|
string PortName { get; set; }
|
|
string[] GetPortNames();
|
|
void Open();
|
|
void Close();
|
|
|
|
string CommandTerminated(string command, string terminator);
|
|
char CommandChar(string command);
|
|
string ReadTerminated(string terminator);
|
|
}
|
|
|
|
[ComVisible(false)]
|
|
public class SerialProcessor : ISerialProcessor
|
|
{
|
|
private SerialPort _serialPort = new SerialPort();
|
|
private Mutex serialMutex = new Mutex();
|
|
|
|
public bool IsOpen => _serialPort.IsOpen;
|
|
|
|
public bool DtrEnable
|
|
{
|
|
get => _serialPort.DtrEnable;
|
|
set => _serialPort.DtrEnable = value;
|
|
}
|
|
|
|
public bool RtsEnable
|
|
{
|
|
get => _serialPort.RtsEnable;
|
|
set => _serialPort.RtsEnable = value;
|
|
}
|
|
|
|
public int BaudRate
|
|
{
|
|
get => _serialPort.BaudRate;
|
|
set => _serialPort.BaudRate = value;
|
|
}
|
|
|
|
public int DataBits
|
|
{
|
|
get => _serialPort.DataBits;
|
|
set => _serialPort.DataBits = value;
|
|
}
|
|
|
|
public StopBits StopBits
|
|
{
|
|
get => _serialPort.StopBits;
|
|
set => _serialPort.StopBits = value;
|
|
}
|
|
|
|
public Parity Parity
|
|
{
|
|
get => _serialPort.Parity;
|
|
set => _serialPort.Parity = value;
|
|
}
|
|
|
|
public string PortName
|
|
{
|
|
get => _serialPort.PortName;
|
|
set => _serialPort.PortName = value;
|
|
}
|
|
|
|
public string[] GetPortNames()
|
|
{
|
|
return SerialPort.GetPortNames();
|
|
}
|
|
|
|
public void Open()
|
|
{
|
|
_serialPort.Open();
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
_serialPort.Close();
|
|
}
|
|
|
|
public string CommandTerminated(string command, string terminator)
|
|
{
|
|
serialMutex.WaitOne();
|
|
try
|
|
{
|
|
_serialPort.Write(command);
|
|
string result = _serialPort.ReadTo("#");
|
|
return result;
|
|
}
|
|
finally
|
|
{
|
|
serialMutex.ReleaseMutex();
|
|
}
|
|
}
|
|
|
|
public char CommandChar(string command)
|
|
{
|
|
serialMutex.WaitOne();
|
|
try
|
|
{
|
|
_serialPort.Write(command);
|
|
var result = _serialPort.ReadChar();
|
|
return Convert.ToChar(result);
|
|
}
|
|
finally
|
|
{
|
|
serialMutex.ReleaseMutex();
|
|
}
|
|
}
|
|
|
|
public string ReadTerminated(string terminator)
|
|
{
|
|
serialMutex.WaitOne();
|
|
try
|
|
{
|
|
string result = _serialPort.ReadTo("#");
|
|
return result;
|
|
}
|
|
finally
|
|
{
|
|
serialMutex.ReleaseMutex();
|
|
}
|
|
}
|
|
}
|
|
}
|