gpt4 book ai didi

c# - 使用串行端口和 ReadAsync 超时的正确方法

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:45 29 4
gpt4 key购买 nike

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

我需要使用 2 个不同的超时时间从串口读取数据。第一次超时是在两条消息之间(这里是 2000 毫秒),第二次是在 2 个字符之间(这里是 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 且未收到任何字节时的输出:

Exception 1: The operation has timed-out. Timeout: 2014 ms
Exception 1: The operation has timed-out. Timeout: 2014 ms
Exception 1: The operation has timed-out. Timeout: 2014 ms
Exception 1: The operation has timed-out. Timeout: 2014 ms
Exception 1: The operation has timed-out. Timeout: 2014 ms
Exception 1: The operation has timed-out. Timeout: 3584 ms
Exception 1: The operation has timed-out. Timeout: 2014 ms
Exception 1: The operation has timed-out. Timeout: 2017 ms
Exception 1: The operation has timed-out. Timeout: 2012 ms
Exception 1: The operation has timed-out. Timeout: 2011 ms
Exception 1: The operation has timed-out. Timeout: 2016 ms
Exception 1: The operation has timed-out. Timeout: 2012 ms
Exception 1: The operation has timed-out. Timeout: 2011 ms
Exception 1: The operation has timed-out. Timeout: 2013 ms
Exception 1: The operation has timed-out. Timeout: 2013 ms

我现在的问题是:

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

最佳答案

问题 1:您以同步方式使用异步方法。通常你会给它一个回调函数,等待一个事件被触发并且这个函数可以被执行。这里有例子 1 & 2用于异步等待方法

问题 2:如果您的情况需要您这样做。我不明白为什么不。

很遗憾,我还不知道如何回答您的第三个问题,所以我暂时保留它。

关于c# - 使用串行端口和 ReadAsync 超时的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37744223/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com