首页 > 解决方案 > Modbus设置的组合框在文本时不起作用

问题描述

我刚开始在 Visual Studio 中创建一个项目。我对此完全陌生。我已经制作了一个表格,我通过 modbus 读取数据。这一切都完美无缺。

但有时我需要能够更改表单中的设置以与 modbus 通信。如果设置是数字,则没有问题。但如果它是一个词,那么我会得到一个错误。

这是我的代码:

Private Sub ComboBox3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.SelectedIndexChanged
        ModbusRTUCom1.Parity = ComboBox3.SelectedItem
End Sub

错误信息是:

--> System.InvalidCastException: 'The conversion from string None to type Integer is invalid.'

我有一个包含 3 个项目的组合框;无,奇数和偶数。我已经尝试了很多我在谷歌上找到的东西,但它不起作用:'(。

错误: 错误

这是项目: 项目

这是组合的项目列表: 项目清单

编辑:没有什么对我有用。然后我突然做了一些简单的事情!

Private Sub ComboBox3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.SelectedIndexChanged
    ModbusRTUCom1.Parity = ComboBox3.SelectedIndex

结束子

标签: vb.netcomboboxmodbus

解决方案


我假设您使用的是EasyModbus 库。既然如此,让我们看一下示例代码

ModbusClient modbusClient = new ModbusClient("COM1");
//modbusClient.UnitIdentifier = 1; Not necessary since default slaveID = 1;
//modbusClient.Baudrate = 9600; // Not necessary since default baudrate = 9600
//modbusClient.Parity = System.IO.Ports.Parity.None;
//modbusClient.StopBits = System.IO.Ports.StopBits.Two;
//modbusClient.ConnectionTimeout = 500;         
modbusClient.Connect();

modbusClient是 aModbusClient并且modbusClient.Parity是类型Parity(anenum具有基础类型integer)。

所以错误告诉您不能将字符串分配给整数类型的变量。根据示例,您可以使用以下语句设置奇偶校验modbusClient.Parity = System.IO.Ports.Parity.None(注意System.IO.Ports.Parity.None= 0); modbusClient.Parity = "none"将导致您看到的错误。

SerialPort 类文档中的示例显示了如何将其转换为字符串/从字符串转换,这个答案也可能有用。

如果您使用Option Strict On,那么编译器应该会发现这样的问题(通常最好在编译时处理错误)。

根据您发布的答案,您似乎没有理解上述内容;这是一个完整的演示,展示了转换字符串 <--> Parity。

Option Strict On 
Imports System.IO.Ports

Module VBModule
 
    Sub Main()
            
    REM The below gets an array of strings containing the available options for parity
    REM Use this to populate your dropdown
    dim parityOptions as String()
    parityOptions = [Enum].GetNames(GetType(Parity))
    
    REM print out available options for parity (as text)
    Console.WriteLine("Possible Parities")
    For Each s As String In parityOptions
       Console.WriteLine(s)
    Next
    
    REM Now lets take a parity in string form and convert to enum
    REM This is what you need to do when you get the value from the dropdown
    Dim parityString as string
    parityString = "Even"
    Dim parity as System.IO.Ports.Parity
    parity = DirectCast([Enum].Parse(GetType(Parity), parityString), System.IO.Ports.Parity)
    Console.WriteLine("Value of parity")
    Console.WriteLine(parity)
    REM convert a second option...
    parityString = "Odd"
    parity = DirectCast([Enum].Parse(GetType(Parity), parityString), System.IO.Ports.Parity)
    Console.WriteLine(parity)
    
    End Sub
End Module

推荐阅读