提问人:Daniel Melendrez 提问时间:10/22/2021 最后编辑:GEOCHETDaniel Melendrez 更新时间:3/2/2023 访问量:681
RJCP 中。IO的。端口 SerialPortsStream System.IO.IOException - 配置无效(BreakState、Length、Position)
RJCP.IO.Ports SerialPortsStream System.IO.IOException - Invalid configuration (BreakState, Length, Position)
问:
我目前正在开发一个简单的 WPF 应用程序,用于从 Arduino Mega Board 采集串行数据(目前用于测试目的,可扩展到其他串行设备)。
环境和包装:
- 目标框架:.NET Framework 4.8、Visual Studio 2019
- SerialPortStream (by Jason Curl - RJCP) 版本: 2.3.1
请注意,我最近开始使用 C#,我对 C++ ;) 更熟悉
我的应用程序在加载时在 ListBox 上搜索并填充我的 PC 中存在的串行端口,然后我必须从 ListBox 中选择所需的端口并使用按钮打开它。它的回调配置对象。SerialPortStream
成功选择端口后,如下图所示,以下异常将抛出到控制台,并且应用将挂起:
因此,我决定在代码的开头插入一个断点来检查我的对象,并且该对象在 和 属性中显示错误。在配置的方法中检查相同的对象 () 会显示相同的错误USBPort
Length
Static Members
Position
USBPort
我的主要应用程序代码的一小段如下(标有 (*) 的行表示我插入的用于调试的断点):
using RJCP.IO.Ports;
using System;
// ... and others
myApp{
public partial class MainWindow: Window {
private string ComPortName;
private int BaudRate;
private SerialPortStream USBPort = new SerialPortStream();
// ... plus other declarations
public MainWindow(){
InitializeComponent();
(*) BaudRate = 115200; // Inserted a breakpoint here to inspect USBPort in the debugger
}
// Start communication Callback/Binding --> Connect button Click binding
private void StartCOM_Click(object sender, RoutedEventArgs e){
try{
(*) USBPort = new SerialPortStream(ComPortName, BaudRate);
USBPort.Open(); // Inserting a breakpoint here shows the same errors in the watch window
// ...subsequent actions
} catch(Exception ex){
if(ex is IOException){
throw new IOException("Unable to create serial port"); // Message does NOT get displayed
}
}
}
请注意,我的方法曾经工作得很好,我能够从串行端口读取行。在我重构了与对象无关的代码的某些部分后,有些东西坏了。我什至尝试使用旧版本的代码,现在它每次都抛出相同的错误。SerialPortStream
- 我使用空构造函数预先声明对象,然后在回调中配置它的方法是否正确?
USBPort
- 属性引用的“指定方法”是什么?
Length
- RJCP dll 是否强烈依赖于所使用的框架?根据 GitHub 存储库,它应该在 4.8 中工作正常。
- 不同的 Windows 10 版本是否与此问题相关?我的代码昨天在我工作的笔记本电脑上运行良好,但在我家的 PC 上却没有。(目前我无法使用那台笔记本电脑)。
- 我是否应该回退到以前版本的 RJCP 包?
答:
1赞
J. Curl
10/29/2021
#1
回顾您的个人问题:
- 我使用空构造函数预先声明我的 USBPort 对象,然后在回调中配置它的方法是否正确?
- 是的。这很好。在端口被 Open()ed 之前,它们只是属性。
- 但是您提供的代码片段忽略了这一点,因为在您实例化了 anyway 的新实例。检查您是否未打开同一端口两次,这可能会导致资源冲突(Windows 不允许多次从一个或多个应用程序打开同一串行端口)。
StartCOM_Click
SerialPortStream
- Length 属性所指的“指定方法”是什么?
- 未定义 and 属性,该属性位于此特定实现中。
Length
Position
CanSeek
false
- 未定义 and 属性,该属性位于此特定实现中。
- RJCP dll 是否强烈依赖于所使用的框架?根据 GitHub 存储库,它应该在 4.8 中工作正常。
- 使用包 2.3.1 包含适用于 .NET 4.0、.NET 4.5 和 .NET Standard 1.5 的库。在 .NET 4.8 上运行时,NuGet 包管理器应选择 .NET 4.5 编译版本,如支持多个目标框架所述。
- 您可以通过检查编译程序旁边给出的库来确认这一点。只需检查尺寸即可。.NET 4.5 版本为 233kB,.NET Standard 版本为 246kB。
RJCP.SerialPortStream.dll
- 您可能知道,如果安装了 .NET 4.8,则运行时本身是所有其他版本的高兼容性就地升级。因此,针对 .NET 4.5 或 .NET 4.8 的软件在下面运行基本上相同的代码(我说本质上,因为 MS 确实有一些兼容性检查,但它们在这里无关紧要)。
- 不同的 Windows 10 版本是否与此问题相关?我的代码昨天在我工作的笔记本电脑上运行良好,但在我家的 PC 上却没有。(目前我无法使用那台笔记本电脑)。
- 这更有可能与驾驶员本身有关,而不是特别喜欢某些东西。不幸的是,从给出的描述来看,很难说什么。若要调试此问题,最好在 GitHub 问题中进行跟踪。
- 我是否应该回退到以前版本的 RJCP 包?
- 已经修复了一些错误等,但这里没有描述任何内容表明这会有所作为。
评论
0赞
Daniel Melendrez
10/29/2021
亲爱的杰森。非常感谢您的全面答复。我可以确认我只通过 Button() 打开()一次端口。事实上,故障点似乎在 Open() 方法中(同样,仅在 Ryzen PC 中)。如果您同意(并且 SOVF 管理员同意),让我们继续在 GitHub 上进行对话
0赞
Daniel Melendrez
10/29/2021
对于任何对此特定案例感兴趣的人,我会在 Jason 的帮助下,尽快回到这里并发布解决方案。;)
评论