Make serial buffer resets optional and improve receive loop

This commit is contained in:
Namhyeon, Go 2025-10-28 14:12:44 +09:00
parent 3ce8d12628
commit 9f4219e971

View File

@ -28,7 +28,8 @@ namespace WelsonJS.Launcher
Handshake handshake = Handshake.None, Handshake handshake = Handshake.None,
int readTimeout = 500, int readTimeout = 500,
int writeTimeout = 500, int writeTimeout = 500,
int readBufferSize = 1024) int readBufferSize = 1024,
bool resetBuffersBeforeRequest = false)
{ {
if (string.IsNullOrWhiteSpace(portName)) throw new ArgumentNullException(nameof(portName)); if (string.IsNullOrWhiteSpace(portName)) throw new ArgumentNullException(nameof(portName));
@ -41,6 +42,7 @@ namespace WelsonJS.Launcher
ReadTimeout = readTimeout; ReadTimeout = readTimeout;
WriteTimeout = writeTimeout; WriteTimeout = writeTimeout;
ReadBufferSize = readBufferSize > 0 ? readBufferSize : 1024; ReadBufferSize = readBufferSize > 0 ? readBufferSize : 1024;
ResetBuffersBeforeRequest = resetBuffersBeforeRequest;
} }
public string PortName { get; } public string PortName { get; }
@ -52,6 +54,7 @@ namespace WelsonJS.Launcher
public int ReadTimeout { get; } public int ReadTimeout { get; }
public int WriteTimeout { get; } public int WriteTimeout { get; }
public int ReadBufferSize { get; } public int ReadBufferSize { get; }
public bool ResetBuffersBeforeRequest { get; }
} }
public SerialPortManager() public SerialPortManager()
@ -140,7 +143,13 @@ namespace WelsonJS.Launcher
return await ExecuteWithRetryAsync( return await ExecuteWithRetryAsync(
parameters, parameters,
(port, token) => SendAndReceiveInternalAsync(port, parameters.ReadBufferSize, payload, encoding, token), (port, token) => SendAndReceiveInternalAsync(
port,
parameters.ReadBufferSize,
payload,
encoding,
parameters.ResetBuffersBeforeRequest,
token),
2, 2,
cancellationToken).ConfigureAwait(false); cancellationToken).ConfigureAwait(false);
} }
@ -186,10 +195,14 @@ namespace WelsonJS.Launcher
int bufferSize, int bufferSize,
byte[] payload, byte[] payload,
Encoding encoding, Encoding encoding,
bool resetBuffers,
CancellationToken token) CancellationToken token)
{ {
port.DiscardInBuffer(); if (resetBuffers)
port.DiscardOutBuffer(); {
port.DiscardInBuffer();
port.DiscardOutBuffer();
}
if (payload.Length > 0) if (payload.Length > 0)
{ {
@ -208,14 +221,17 @@ namespace WelsonJS.Launcher
if (read > 0) if (read > 0)
{ {
stream.Write(buffer, 0, read); stream.Write(buffer, 0, read);
if (read < buffer.Length) if (port.BytesToRead == 0)
{ {
break; break;
} }
} }
else else
{ {
break; if (port.BytesToRead == 0)
{
break;
}
} }
} }
catch (TimeoutException) catch (TimeoutException)