我创建了一个变量作为新的串行端口,如下所示:
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
答案 0 :(得分: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即可解决此问题,然后选择正确的构造函数。