首页 > 解决方案 > 尝试从串行端口接收数据时遇到问题

问题描述

嗨,我有一个连接到我的电脑的端口,它不断地发送数据,我的目标是从中接收数据并将其打印出来。问题是我真的不知道它正在发送什么类型的数据以及我应该如何阅读它......

private void Button_Receive_Data_Click(object sender, EventArgs e)
    {
        GroupBox_Serial_Transmit.Enabled = false;
        #region
        string Port_Name = ComboBox_Available_SerialPorts.SelectedItem.ToString();
        int Baud_Rate = Convert.ToInt32(ComboBox_Standard_Baundrates.SelectedItem);


        COMport = new SerialPort(Port_Name, Baud_Rate);
        #endregion
        COMport.ReadTimeout = 3500; //3.5 sekundes



        try
        {
            COMport.Open();
            if (COMport.IsOpen == true)
            {
                TextBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                ReceivedData = COMport.ReadExisting();
                this.Invoke(new EventHandler(ShowData));

                GroupBox_Serial_Transmit.Enabled = true;

            }
            else
            {
                MessageBox.Show("Unable to Write to COM port ");
                GroupBox_Serial_Transmit.Enabled = true;
                COMport.Close();
            }
        }
        catch (TimeoutException SerialTimeOutException)
        {
            MessageBox.Show(SerialTimeOutException.ToString());
            COMport.Close();

            GroupBox_Serial_Transmit.Enabled = true;
        }
    }

    private void ShowData(object sender, EventArgs e)
    {
        TextBox_System_Log.Text = ReceivedData;
    }

这是我的代码,它试图打开端口并读取数据。我尝试调试它,ReadExising 函数返回一串我无法理解的符号。我尝试了几种方法,但都没有奏效,现在我很绝望。很抱歉,可能有一些不必要的代码行,因为我是 SerialPort 通信的初学者。

标签: c#winformsserial-portports

解决方案


您所希望的只是串行发送可读的文本。在这种情况下,您的主要目标是计算波特率。由于您是初学者,只需安装docklight(或者可能是picocom 或您可用的任何工作工具)。尝试从最高(115200)开始的每个波特率 [检查下面的注释] 和 8 个数据,向下移动,并且对于您以这种方式检查的每个波特率,乱搞停止位和奇偶校验。

或者(感谢 Trevor 的启发)您可以运行一个工具来检查重复的 1 和 0。例如,如果您的流是 110011001100000011110011,那么好的候选者是 115200/2。对于 111000111000111000000111000111111111,一个好的候选人是 115200/3 等

为了完整起见,上述方法可能没有结论,因为数据“可能”实际上是 1100110011001100。这没有什么意义,因为这是一种非有效编码,但与原始问题一致,“我们不知道”串行发送的内容。

现在你的希望是你最终偶然发现了正确的配置并真正获得了可读的文本。如果这样做,您可以返回到 C# 并设置正确的配置并恢复调试。

如果您没有找到,这意味着数据是二进制格式,我们无法确定正确的传输配置和数据内容。

您的下一个赌注是保存足够长的日志并使用十六进制编辑器打开它。


笔记:

即使您可能会收到一些设备信息(例如波特率 9600),仍然建议使用上述步骤。Infact OP 偶然发现了错误的信息,而 9600 不起作用,115200 起作用。

115200 被认为是 UART 的最大值。但是通过适当的接口,您可以达到 230400 和 460800... 甚至更多。为了使这个答案面向未来,请验证您的硬件和串行驱动程序支持的接口最大值。


推荐阅读