我使用过串口,其原始方法如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
我现在的问题是: