3

我正在进行一个项目,我必须从 Arduino 的传感器读取 CSV 格式的串行数据,使用 C# 解析获得的值,并显示实时图表。

我是多线程概念的新手,我对应该创建多少线程以及每个线程应该分配什么任务感到困惑。

有什么建议么?这是一个初始示例代码,因此可能有错误。

 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        RxString = serialPort1.ReadExisting();
        RxString = RxString.Replace("$", "");
        this.Invoke(new EventHandler(DisplayText));

    }
    //display the parsed string List
    private void DisplayText(object sender, EventArgs e)
    {

        richTextBox1.AppendText(RxString);
        GlobalList.AddRange(parsed());
        richTextBox2.Text = String.Join(Environment.NewLine, GlobalList);
    }
    //set the input rate
    private void Start_Click(object sender, EventArgs e)
    {
        serialPort1.PortName = "COM32";
        serialPort1.BaudRate = 9600;
        serialPort1.DtrEnable=true;
        serialPort1.Open();
        if (serialPort1.IsOpen)
        {
            Start.Enabled = false;
            Stop.Enabled = true;
            richTextBox1.ReadOnly = false;

        }

    }
 public List<String> parsed()
    {
                string line;
                int loc = 0;
                List<string> stringList;
                line = richTextBox1.Text;
                stringList = new List<string>(line.Split(','));
                richTextBox3.AppendText("\n Pressure:" + stringList[loc]);
                loc++;
                richTextBox3.AppendText("\n Accelerometer:" + stringList[loc]);
                loc++;
                richTextBox3.AppendText("\n Temperature:" + stringList[loc]);
                loc++;
                richTextBox3.AppendText("\n Height:" + stringList[loc]);
                loc++;


            return stringList;
    }

//plot an elementary graph from the values obtained
public void displayglobal()
    {

        for (int i = 0; i < GlobalList.Count; i++)
        {
            if (i % 3 == 0)
            {
                rtxtConsole.AppendText("\nPressure: " + GlobalList[i]);
                chart1.Series["tempvspressure"].Points.AddXY(GlobalList[i], GlobalList[i + 2]);
            }


        }
    }
4

2 回答 2

0

我强烈建议在任何可能阻塞的地方使用工作线程,因为这会冻结 UI。

我会分拆一个线程来读取传入的流并解析数据单元。如果流是 CSV,那么流解析器可以使用您的行分隔符(通常是新行)来分隔单元。

如果每行的工作负载非常低,则流读取线程每次有一个完整的数据单元时就可以调用UI线程进行处理。如果正在处理的行数导致 UI 锁定,则可能需要另一个工作线程将它们批量插入 UI。为此,您需要一个线程安全队列。

我在记录监听网络流的应用程序时已经这样做了很多次,并且对于串行端口来说问题似乎没有什么不同。

于 2013-09-06T16:23:00.107 回答
0

借助asyncC# 中的新支持,您根本不需要多个线程。

您可以使用port.BaseStream.ReadAsync()which 将配合 UI 消息处理。

于 2014-08-29T04:38:53.747 回答