RJCP 中。IO的。端口 SerialPortsStream System.IO.IOException - 配置无效(BreakState、Length、Position)

RJCP.IO.Ports SerialPortsStream System.IO.IOException - Invalid configuration (BreakState, Length, Position)

提问人:Daniel Melendrez 提问时间:10/22/2021 最后编辑:GEOCHETDaniel Melendrez 更新时间:3/2/2023 访问量:681

问:

我目前正在开发一个简单的 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

Window capture from Serial Ports selection ListBox

成功选择端口后,如下图所示,以下异常将抛出到控制台,并且应用将挂起:

Watch window results for USBPort object

因此,我决定在代码的开头插入一个断点来检查我的对象,并且该对象在 和 属性中显示错误。在配置的方法中检查相同的对象 () 会显示相同的错误USBPortLengthStatic MembersPositionUSBPort

Watch window showing USBPort Invalid configuration

我的主要应用程序代码的一小段如下(标有 (*) 的行表示我插入的用于调试的断点):

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 包?
C# WPF 异常 串行端口

评论


答:

1赞 J. Curl 10/29/2021 #1

回顾您的个人问题:

  • 我使用空构造函数预先声明我的 USBPort 对象,然后在回调中配置它的方法是否正确?
    • 是的。这很好。在端口被 Open()ed 之前,它们只是属性。
    • 但是您提供的代码片段忽略了这一点,因为在您实例化了 anyway 的新实例。检查您是否未打开同一端口两次,这可能会导致资源冲突(Windows 不允许多次从一个或多个应用程序打开同一串行端口)。StartCOM_ClickSerialPortStream
  • Length 属性所指的“指定方法”是什么?
    • 未定义 and 属性,该属性位于此特定实现中。LengthPositionCanSeekfalse
  • 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 的帮助下,尽快回到这里并发布解决方案。;)