0

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.

0 Answers0