使用组合框更改串口时,为什么会出现System.InvalidCastException? VB.NET 2019

问题描述 投票:-1回答:1

我创建了一个变量作为新的serialport,如下所示:

Public Shared panelComm As New SerialPort("COM3")

现在,当使用组合框填充可用COM端口列表来尝试更改端口号时,它会一直给我这个例外:

System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'System.IO.Ports.SerialPort'.'

我改变它的代码是这样的:

panelComm.Close()
panelComm = panelCOMdrp.SelectedItem
panelComm.Open()

panelComm是端口变量,panelCOMdrp是具有端口列表的下拉组合框。

编辑:这是我用来填充程序可用的串口列表的代码:

For Each sp As String In My.Computer.Ports.SerialPortNames
      panelCOMdrp.Items.Add(sp)
Next
vb.net exception variable-assignment communication
1个回答
0
投票

如果您的组合存储串行端口的名称,则每个Item都是一个字符串而不是SerialPort对象实例。这是错误消息的原因。您正在尝试将字符串分配给类型为SerialPort的变量。即使该字符串是SerialPort的有效名称,编译器也不会自动从该字符串创建SerialPort。

你需要明确并从该字符串创建一个SerialPort实例,因此你应该写(当你声明变量时)

' Always check if a selection is present or not
if panelCOMdrp.SelectedItem IsNot Nothing Then
    panelComm = New SerialPort(panelCOMdrp.SelectedItem.ToString())
End If

@ nbk在下面评论中的观察是正确的,因为SelectedItem是由Object类型定义的。此定义与SerialPort的构造函数一起导致问题。 SerialPort有许多重载,其中一个重载需要一个IContainer而另一个需要一个String。传递SelectedItem(一个Object)会强制编译器选择需要IContainer的构造函数,这会产生错误。只需添加ToString即可解决问题,并选择正确的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.