2 Commits

2 changed files with 24 additions and 5 deletions

View File

@ -1,4 +1,5 @@
using System;
using System.Runtime.InteropServices;
namespace Nefarius.Peripherals.SerialPort;
@ -22,4 +23,14 @@ public class CommPortException : ApplicationException
public CommPortException(Exception e) : base("Receive Thread Exception", e)
{
}
public CommPortException(string message, int error) : base(message)
{
Win32Error = error;
}
/// <summary>
/// The Win32 error that caused the exception.
/// </summary>
public int Win32Error { get; } = Marshal.GetLastWin32Error();
}

View File

@ -30,6 +30,7 @@ public partial class SerialPort : IDisposable
private Exception _rxException;
private bool _rxExceptionReported;
private Thread _rxThread;
private CancellationTokenSource _cts;
private int _stateBrk = 2;
private int _stateDtr = 2;
private int _stateRts = 2;
@ -70,8 +71,12 @@ public partial class SerialPort : IDisposable
}
_hPort = PInvoke.CreateFile(PortName,
(uint)(FILE_ACCESS_RIGHTS.FILE_GENERIC_READ | FILE_ACCESS_RIGHTS.FILE_GENERIC_WRITE), 0,
null, FILE_CREATION_DISPOSITION.OPEN_EXISTING, FILE_FLAGS_AND_ATTRIBUTES.FILE_FLAG_OVERLAPPED, null);
(uint)(FILE_ACCESS_RIGHTS.FILE_GENERIC_READ | FILE_ACCESS_RIGHTS.FILE_GENERIC_WRITE),
0,
null,
FILE_CREATION_DISPOSITION.OPEN_EXISTING, FILE_FLAGS_AND_ATTRIBUTES.FILE_FLAG_OVERLAPPED,
null
);
if (_hPort.IsInvalid)
{
@ -80,7 +85,7 @@ public partial class SerialPort : IDisposable
return false;
}
throw new CommPortException("Port Open Failure");
throw new CommPortException("Port Open Failure", Marshal.GetLastWin32Error());
}
_online = true;
@ -147,6 +152,7 @@ public partial class SerialPort : IDisposable
_rxException = null;
_rxExceptionReported = false;
_cts = new CancellationTokenSource();
_rxThread = new Thread(ReceiveThread)
{
Name = "CommBaseRx", Priority = ThreadPriority.AboveNormal, IsBackground = true
@ -182,10 +188,12 @@ public partial class SerialPort : IDisposable
private void InternalClose()
{
_cts.Cancel();
PInvoke.CancelIo(_hPort);
if (_rxThread != null)
{
_rxThread.Abort();
_rxThread.Join();
_rxThread = null;
}
@ -457,7 +465,7 @@ public partial class SerialPort : IDisposable
try
{
while (true)
while (!_cts.IsCancellationRequested)
{
COMM_EVENT_MASK eventMask = 0;