【问题标题】:How to buffer incoming serial Port Values. C#如何缓冲传入的串行端口值。 C#
【发布时间】:2017-03-22 18:33:47
【问题描述】:

您好,有人能告诉我们在串行端口上缓冲传入值的最佳方法是什么吗?因为我有一些值在写入文本框时被损坏的问题。我已经在以下问题中问过这个问题:Why do I get partly strange values from serial port in C# 有人告诉我这是因为我没有缓冲它们。当我将从串口获取的字符串写入文本文件时,我得到了这个:

      12.5 g   

      12.5
 g   


 12.5 g   

      12.
5 g   

      12.5 g   

      12.5 g   

      12.5 g   

      1
2.5 g   


    12.5 g   


12.5 g   

      12.5 g   

      12.5 g   


      12.5 g   


 12.5 g   

      12.5 g   


  12.5 g   

      12.5 g   

希望有人可以帮助我。

【问题讨论】:

  • 我阅读了上一个问题,但您似乎不明白潜在的问题是什么。假设串口吐出“12.5g, 12.6g, 12.4g”,但你每次读入超过5个字符而不自知,所以你一次读入“12.5g, 1”,然后下一次读入在“2.6g,12”中。或类似的东西。您在文本框中写信可能与您的问题无关。
  • 我认为问题出在此处:int dataLength = _serialPort.BytesToRead; byte[] data = new byte[dataLength]; int nbrDataRead = _serialPort.Read(data, 0, dataLength); if (nbrDataRead == 0) return; string str = Encoding.UTF8.GetString(data);

标签: c# serial-port buffer


【解决方案1】:

最好的处理方法是使用 'g' 来标记字符串的结尾:

string leftOver = "";

// Read the data like you have

string str = leftOver + Encoding.UTF8.GetString(data);
int index = str.IndexOf('g');
if (index == -1)
{
    leftOver += str;
}
else
{
    leftOver = str.Substring(index + 1);
    str = str.Substring(0, index + 1);
}

【讨论】:

  • 抱歉,这没有帮助,因为没有分号。我刚刚将它们添加到值列表中,以便您有更好的概览。我认为问题在于我的计算机不知道串行端口何时准备好一个值。这样他就知道现在下一个值开始了。但为什么?或者如何设置?!
  • 这一切都取决于设备。
  • 你认为它与 StopBits 或 Parity 或 Handshake 有关吗?我尝试了很多不同的配置......没有任何帮助......现在我只读出了由 15 或 16 个字符组成的值。也许这就足够了。还是谢谢你!
  • @SardarAgabejli 您始终可以使用“g”作为终止符。我会为你更新我的答案。
  • 谢谢!我明天试试,告诉你它是否有效。
【解决方案2】:

好的,我现在知道了!

首先,我必须将通过串行端口从刻度传来的值缓冲在一个文件中。 不知道为什么,但是单个值的格式正确,可以毫无问题地读出。

private void SerialPortOnDataReceived(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{

    if (InvokeRequired)     //<-- Makes sure the function is invoked to work properly in the UI-Thread
        BeginInvoke(new Closure(() => { SerialPortOnDataReceived(sender, serialDataReceivedEventArgs); }));     //<-- Function invokes itself
    else
    {
        int dataLength = _serialPort.BytesToRead;                

        byte[] data = new byte[dataLength];
        int nbrDataRead = _serialPort.Read(data, 0, dataLength);
        if (nbrDataRead == 0)
            return;
        string str = Encoding.UTF8.GetString(data);


        //Buffer Values in a text file at first!
        File.AppendAllText("buffer1.txt", str);
        string strnew = File.ReadLines("buffer1.txt").Last();

        textBox5.Text = strnew;

我的下一个问题是如何将缓冲区文件保持在适当的大小。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多