I created a serial port singleton worker thread with:
builder.Services.AddHostedService<SerialPortSingleton>();
builder.Services.AddSingleton(x => x.GetServices<IHostedService>()
.OfType<SerialPortSingleton>().First());
and SerialPortSingleton as:
public sealed class SerialPortSingleton: BackgroundService
{
const string portName = "COM5";
const int baudRate = 9600;
readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource();
readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
SerialPort serialPort;
bool portOpened = false;
while (!portOpened)
{
try
{
serialPort = new SerialPort(portName, baudRate);
serialPort.RtsEnable = true;
serialPort.DataReceived += SerialPort_DataReceived;
serialPort.Open();
portOpened = true;
Console.WriteLine("COM port opened...");
serialPort.WriteLine("AT+CSCS=\"UCS2\"\r");
Thread.Sleep(500);
// Set the text mode
serialPort.WriteLine("AT+CMGF=1\r");
// Wait for incoming messages
Console.WriteLine("Waiting for incoming messages...");
}
catch (Exception ex)
{
Console.WriteLine("Error opening COM port: " + ex.Message);
Thread.Sleep(20000);
}
}
using(stoppingToken.Register(_stoppingCts.Cancel))
{
await Task.Delay(Timeout.Infinite, _stoppingCts.Token);
}
Console.WriteLine("Worker thread finished!");
}
void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Cast the sender object to a SerialPort object
SerialPort serialPort = (SerialPort) sender;
ProcessDataAsync(serialPort).Wait();
}
//....
}
Why the SerialPort_DataReceived didn't raise even there is COM port message? Similar console version did work properly.
The asp dotnet core hosted service version should work as the console one.