如何获取设备的波特率?

7
我想知道在初始化SerialPort类并设置其值之前,是否有一种方法可以获取连接到RS232端口的Baud Rate。让我试着解释一下原因...
今天,我正在使用两个不同的RFID读卡器设备,每个设备都使用不同的BaudRate,所以如果我在创建SerialPort类时设置了错误的波特率,它将会读取错误的卡片ID,而不是获取真实的卡片ID,它将会得到像"????|W2???"这样的东西。此外,设备可能还具有USB端口。
那就是为什么我想在实例化SerialPort类之前知道设备的波特率。

1
你知道你的程序支持哪些波特率和设备。当你请求某些信息时,你希望得到什么。逻辑上的解决方案是使用一个波特率连接设备,检查请求的数据是否正确,如果不正确则断开连接并尝试其他波特率。无法从串行设备“请求”波特率。 - Security Hound
@Ramhound,您可以将此作为答案发布。 - Manu Clementz
@Ramhound 嗯...我有两个不同的设备,一个在9600上工作,另一个在19200上工作,但我无法创建一个应用程序,在其中必须根据用户设备的配置更改其值...你知道吗? 但是我该怎么做呢?据我所知,当读取RFID卡时,我将能够测试数据。您能给我一些解决方法吗?谢谢! - PlayHardGoPro
@ManuLetroll - 我可以把它发布为答案,因为我没有代码可以发布,所以我不会这样做。 - Security Hound
@Ramhound 我想我会用配置创建一个新的表单... 我只是不明白一件事:我将打开一个新的WinForm来设置配置,我如何获取这些值并设置到预览WinForm中呢? 也许在我的数据库中创建一个新表格来存储配置,你觉得怎么样?这是一个好的做法吗? - PlayHardGoPro
显示剩余3条评论
2个回答

6

我尝试连接我的串口USB设备,不断改变波特率并检查。ComboBox中包含可能的一系列波特率。

    public void initConfig(SerialPort serialPort)
    {
        // you can assign these values in a combo box
        string[] ports= "{COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8"};

        //you can assign these values in a combo box in a string format
        int[] baudRate = { 4800, 9600, 19200, 38400, 57600, 115200, 230400 };

        serialPort.PortName = ports[0]; //else get from combobox  : portCombobox.SelectedItem
        serialPort.BaudRate = baudRate[0];
        //serialPort.BaudRate = Int32.Parse(speedComboBox.SelectedItem.ToString());

        //you can have controls to store and change these values if required
        serialPort.Handshake = System.IO.Ports.Handshake.None;
        serialPort.Parity = System.IO.Ports.Parity.None;
        serialPort.DataBits = 8;
        serialPort.StopBits = System.IO.Ports.StopBits.One;
        serialPort.ReadTimeout = 200;
        serialPort.WriteTimeout = 50;
    }

将字符串转换为相应的类型并调用open。
最后:
    public void callingMethod() //or your connect event attached control
    {
        SerialPort serialPort = new SerialPort();

        initConfig(serialPort);

        try
        {
            serialPort.Open();
        }
        catch
        {
            MessageBox.Show("Error: Unable to Open the serial interface !");
            return;
        }
    }

谢谢回答。我会创建一个类似class.cs的类吗?然后在我的winform配置中将其作为对象调用并分配值。对吗?=X - PlayHardGoPro
1
没问题,你可以!为了更清晰明了,我已经简化并修改了上面的回答。由于我今天要离开,可能无法及时回复。祝你好运! - KbManu
谢谢。我只需要弄清楚如何保存我的Form2上的配置,然后使用在Form2上设置的配置调用我的Form1中的SerialPort类... - PlayHardGoPro
你好,我遇到了同样的问题。你能否查看下面的问题:https://stackoverflow.com/questions/59575956/how-to-get-event-for-different-baudrate - Ayushi Detroja

5

根据连接的详细信息,您可以循环遍历波特率列表,尝试连接,然后执行回声测试。如果您在错误的速率下连接,则您的回声将返回垃圾而不是发送的字符串。这种方法对我有效。


你能详细说明一下如何进行回声测试吗?这听起来是我特定情况下的一个合理解决方案。 - thedouglenz
基本上每个终端程序都有一个“echo”命令——dos/batch、linux/bash、uboot等。发出这样的命令是完全安全的。如果您可以以编程方式向终端发送命令并获取结果,那么执行类似于“echo my-test-string”的命令应该会返回“my-test-string”。如果波特率正确,那么这将起作用。如果不正确,则值将返回错误,即输出将不等于输入。 - BuvinJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接