无法尝试从串行端口接收数据

时间:2018-05-21 21:58:42

标签: c# winforms serial-port ports

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

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通信的完全初学者。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

备注:

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

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