0

My function can read and send serial strings.
Read and write is in a while loop.
Right now the code stops at await dataReader.LoadAsync until a serial essage is received.
How do I make a timeout for this?
E.g. if nothing is received after 500ms, cancel await dataReader.LoadAsync and finish the loop.

I experimented with cancallationtokens, but without any success.

    public async void Serial() 
    {
     //configure serial setting
     //configure serial setting
     //configure serial setting
     //configure serial setting

        // Seriell while
        while (true)
        {

            //send
            dataWriter.WriteString(txBuffer);
            bytesWritten = await SerialPort.OutputStream.WriteAsync(dataWriter.DetachBuffer());

            textblock_DebugTx_live.Text = txBuffer;                     //Ausgabe Debug Tx Senden

            //receive
            uint bytesToRead = await dataReader.LoadAsync(maxReadLength);
            string rxBuffer = dataReader.ReadString(bytesToRead);

            textblock_DebugRx_Gas_live.Text = rxBuffer;     //Ausgabe Wert Alkoholsensor


        } //Seriell while
    } //Seriell

When I try the follow, I get errors.
- maxReadLenght goes into task and not to bytesToRead.
- error at await task "uint contains no definition for GetWaiter"
- CancellationToken is invalid

            //receive
            uint bytesToRead;
            int timeout = 1000;
            var task = await dataReader.LoadAsync(maxReadLength);
            if (await Task.WhenAny(task, Task.Delay(timeout, CancellationToken)) == task)
            {
                // Task completed within timeout.
                // Consider that the task may have faulted or been canceled.
                // We re-await the task so that any exceptions/cancellation is rethrown.
                await task; 
            }
            else
            {
                // timeout/cancellation logic
            }


            string rxBuffer = dataReader.ReadString(bytesToRead);
TonicLoyal
  • 93
  • 8

1 Answers1

0

I'd look into Task.WhenAny and Task.Delay.

This is more or less a duplicate of:

Asynchronously wait for Task<T> to complete with timeout