diff --git a/Bonsai.Harp/Bonsai.Harp.csproj b/Bonsai.Harp/Bonsai.Harp.csproj
index 1cec944..7919e01 100644
--- a/Bonsai.Harp/Bonsai.Harp.csproj
+++ b/Bonsai.Harp/Bonsai.Harp.csproj
@@ -7,7 +7,8 @@
true
net462;netstandard2.0
true
- 3.5.1
+ 3.5.2
+
diff --git a/Bonsai.Harp/Device.cs b/Bonsai.Harp/Device.cs
index 4d0253f..72eca9b 100644
--- a/Bonsai.Harp/Device.cs
+++ b/Bonsai.Harp/Device.cs
@@ -7,6 +7,7 @@
using System.Xml.Serialization;
using System.Threading.Tasks;
using System.Threading;
+using System.IO;
namespace Bonsai.Harp
{
@@ -255,6 +256,26 @@ static IObservable GetDeviceName(string portName, LedState ledState, Led
.FirstAsync();
}
+ private void CloseTransport(SerialTransport transport)
+ {
+ try
+ {
+ var writeOpCtrl = OperationControl.FromPayload(MessageType.Write, new OperationControlPayload(
+ OperationMode.Standby,
+ dumpRegisters: false,
+ MuteReplies,
+ VisualIndicators,
+ OperationLed,
+ Heartbeat));
+ transport.Write(writeOpCtrl);
+ }
+ catch (Exception ex) when (ex is IOException || ex is InvalidOperationException || ex is ObjectDisposedException)
+ {
+ // ignore port IO errors
+ }
+ finally { transport.Close(); }
+ }
+
///
/// Connects to the specified serial port and returns an observable sequence of Harp messages
/// coming from the device.
@@ -265,18 +286,7 @@ public override IObservable Generate()
return Observable.Create(async (observer, cancellationToken) =>
{
var transport = await CreateTransportAsync(observer, cancellationToken);
- return Disposable.Create(() =>
- {
- var writeOpCtrl = OperationControl.FromPayload(MessageType.Write, new OperationControlPayload(
- OperationMode.Standby,
- dumpRegisters: false,
- MuteReplies,
- VisualIndicators,
- OperationLed,
- Heartbeat));
- transport.Write(writeOpCtrl);
- transport.Close();
- });
+ return Disposable.Create(() => CloseTransport(transport));
});
}
@@ -299,16 +309,8 @@ public IObservable Generate(IObservable source)
return Disposable.Create(() =>
{
- var writeOpCtrl = OperationControl.FromPayload(MessageType.Write, new OperationControlPayload(
- OperationMode.Standby,
- dumpRegisters: false,
- MuteReplies,
- VisualIndicators,
- OperationLed,
- Heartbeat));
- transport.Write(writeOpCtrl);
sourceDisposable.Dispose();
- transport.Close();
+ CloseTransport(transport);
});
});
}