使用串口和ReadAsync

时间:2016-06-10 09:06:45

标签: c# asynchronous mono serial-port rs485

我使用过串口,其原始方法如BytesToRead,Read and Write之前。据说这些是不可靠的,我有很多忙等待,我试图切换到它的异步方法。

我需要从串口读取2个不同的超时时间。第一个超时是两个消息之间(这里是2000毫秒),第二个是两个字符(这里是10毫秒)。因此,我为每个ReadAsync调用更改ReadTimeout,如下所示:

    public int Read(byte[] buffer, int offset, int count, bool isFirstChar)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();

        try
        {
            m_serialPort.ReadTimeout = isFirstChar ? 2000 : 10;
            Task<int> task = m_serialPort.BaseStream.ReadAsync(buffer, offset, count);
            task.Wait();
            return task.Result;
        } catch (AggregateException err)
        {
            stopWatch.Stop();
            int cnt = 0;
            foreach (Exception e in err.InnerExceptions)
            {
                if (e is TimeoutException)
                {
                    Console.WriteLine(string.Format("Exception {0}: {1} Timeout: {2} ms", ++cnt, e.Message, stopWatch.ElapsedMilliseconds));
                }
            }

            return -1;
        }
    }

发生AggregateException且未收到任何字节时的输出:

  

异常1:操作已超时。超时:2014 ms
  例外1:操作已超时。超时:2014 ms
  例外1:操作已超时。超时:2014 ms
  例外1:操作已超时。超时:2014 ms
  例外1:操作已超时。超时:2014 ms
  例外1:操作已超时。超时:3584毫秒
  例外1:操作已超时。超时:2014 ms
  例外1:操作已超时。超时:2017毫秒   例外1:操作已超时。超时:2012 ms
  例外1:操作已超时。超时:2011 ms
  例外1:操作已超时。超时:2016 ms
  例外1:操作已超时。超时:2012 ms
  例外1:操作已超时。超时:2011 ms
  例外1:操作已超时。超时:2013 ms
  例外1:操作已超时。超时:2013 ms

我现在的问题是:

  • 这是使用.Asit()的ReadAsync方法的正确方法吗?
  • 在ReadAsync调用之前每次都可以更改ReadTimeout吗?
  • 我应该在ReadAsync中使用CancellationToken作为参数,如果是,那么最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

问题1:您以同步方式使用异步方法。 通常你会给它一个回调函数,等待一个事件被触发,这个函数可以执行。 以下是1&amp; 2用于asynch等待方法论

问题2:如果您的情况需要,请执行此操作。我不明白为什么不。

不幸的是,我还不知道如何回答你的第三个问题所以我现在就把它打开。