200 块有偿求助 C#高速读取串口,导致软件闪退的问题。

52 天前
 hulalahei

开发框架是 Avaloina 11.2.2 + .NET 8.0 ,包是 System.IO.Ports 9.0.0-preview

问题描述:电脑通过串口读取硬件的数据,设备会连续不断返回数据,如果设备每秒返回 50 次数据,软件就不会闪退。如果设备返回数据的速度超过 200 次每秒,就有一定的概率会出现闪退的问题,闪退的频率大概就是 1-2 小时出现一次,偶尔会 10 分钟内连续出现两次。我换过不同的设备,只要是读取速度过快,都会出现相同的问题。

读取数据的代码片段是:

_serialPort = new SerialPort();
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.RtsEnable = true;
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout  = 5;  
_serialPort.WriteTimeout = 5;
_serialPort.ReceivedBytesThreshold = 1;
_serialPort.DataReceived += OnSerialDataReceived;

private  async void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs e){
   var buffer = new byte[512]; // 最多读 10 字节
   int numRead = await _serialPort.BaseStream.ReadAsync(buffer, 0, buffer.Length);
}

闪退的时候报错信息:

[06/02/2025 01:20:02] InvalidOperationException: Argument_NativeOverlappedAlreadyFree
   at System.Threading.ThreadPoolBoundHandle.OnNativeIOCompleted(IntPtr instance, IntPtr context, IntPtr overlappedPtr, UInt32 ioResult, UIntPtr numberOfBytesTransferred, IntPtr ioPtr)

第一个帮助我解决问题的小伙伴,200 红包感谢。

1865 次点击
所在节点    C#
23 条回复
hahiru
51 天前
@hulalahei #18 没事不用了。
hulalahei
50 天前
@ysc3839 我一开始就是循环 read 的,返回的数据速度上升之后,大概十分钟就会出现同样的问题。可能和设备有一定的关系,这个设备十几年前买的。但是新设备同样有这个问题,只是出现的频率低一点。
kevin100702
38 天前
system.io.pipeline 才是终极解决方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1138099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX