C#中的串行端口流线端字符

时间:2017-09-04 10:01:45

标签: c# winforms encoding character-encoding character

我从设备流式传输数据,我需要找到一种方法来捕捉" line end"符号结束这个符号的分隔线像任何像超级终端那样的软件。 但我无法抓住这个象征。

目前我收到的流看起来像这样:

<00> 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0 00 00 )0

但我需要在Windows窗体的textBox中看起来像这样:

)0 00 00

)0 00 00

)0 00 00

)0 00 00

)0 00 00

)0 00 00

我已经制作了一个代码,当它找到特定的字符串时会将流式字符串分开,但是对于&#34; bind&#34;那个字符串很棘手。我知道应该是ASCII ASCII字符,但是我找不到如何将它编码到我的程序和使用的方式。

P.S。实际上,当我简单地复制这个特征时,#34;&#34;到特定的texBox,然后应用于变量并在程序中使用,它的工作原理,但它看起来像是错误的移动方式,因为我不能将它直接粘贴到字符串变量中的Visual Studio中。

我使用此事件代码从串行端口接收数据:

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        try
        {

            this.Invoke(new EventHandler(write_to_field)); 

        }
        catch (ObjectDisposedException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (ArgumentOutOfRangeException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (ArgumentException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (InvalidOperationException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

这是我使用的方法:

    public void write_to_field(object sender, EventArgs e)
    {

        String stringToShow;
        String delimiter = textBox4.Text;
        if (textBox5.Text.Length <= Convert.ToInt16(textBox3.Text))
        {
            String DispString;
            String toFind = textBox4.Text;
            DispString = serialPort1.ReadExisting();
            int index = DispString.IndexOf(toFind);
            textBox5.AppendText(DispString);
            if (index != 0)
            {
                textBox5.AppendText(DispString.Remove(0, 1));
            }
        }
        else
        {
            stringToShow = textBox5.Text;
            textBox6.Text = stringToShow;
            textBox5.Text = "";
        }
    }

我认为它远非完美,所以我也非常感谢有关它的建议。

在建议后,我重新编写了这样的代码:

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {

        write_to_field();

    }


    public void write_to_field() 
    {
        serialPort1.NewLine = "/r/n";
        try
        {
            textBox1.Text = serialPort1.ReadLine();
        }

        catch (TimeoutException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Some title", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (System.IO.IOException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Some title", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (ObjectDisposedException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (ArgumentOutOfRangeException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (ArgumentException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (InvalidOperationException ex)
        {
            MessageBox.Show(Convert.ToString(ex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

但是有System.IO.IOException https://msdn.microsoft.com/en-us/library/ms164917.aspx 意味着没有什么可读的。但这可能是因为Hyperterm可以阅读它。

我尝试使用ReadLine,当我启动项目但它也没有用。我很冷,没有找到任何好的解决方案这可能有什么问题?

1 个答案:

答案 0 :(得分:0)

感谢您或提供有关实施的更多详情。

基于此,我看到你正在调用serialPort1.ReadExisting()方法。这将读取存储在serialPort缓冲区中的所有现有数据。您可以尝试指定换行符,并将其添加到SerialPort NewLine属性中。然后遍历SerialPort.ReadLine方法,该方法只读取缓冲区中的数据,直到命中下一个NewLine字符串。

有关详细信息,请参阅文档:NewLineReadLine with example

编辑:

根据ReadLine方法的文档,ReadLine方法只应抛出InvalidOperationExceptionTimeoutException。当我抛出IOException时,我认为可能还有其他错误。异常消息说什么,堆栈跟踪是什么?有没有Inner Exceptions