簡體   English   中英

C#從傳感器讀取串行數據

[英]C# Reading Serial data from sensor

我想為我的設備制作一個GUI,以顯示每個傳感器的值。 我的設備以這種格式發送數據

:1*895*123; :1*987*145;

*用於從傳感器中分離數據

; 用於數據結束

:用於下一個循環中的數據開始

我有變量dot,Rx1和Ry2來存儲數據並將其顯示在標簽上,但看起來我的程序無法正常工作..這是我的代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string TestText, Rx1, Ry1, dot;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }



    private void button1_Click(object sender, EventArgs e)
    {
        serialPort1.PortName = "COM7";
        serialPort1.BaudRate = 2400;

        serialPort1.Open();
        if (serialPort1.IsOpen)
        {
            button1.Enabled = false;
            button2.Enabled = true;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (serialPort1.IsOpen)
        {
            serialPort1.Close();
            button1.Enabled = true;
            button2.Enabled = false;
        }

    }

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        TestText = serialPort1.ReadExisting();
        string[] nameArray = TestText.Split ('*');
        foreach (string name in nameArray)
        {
            dot = nameArray[0];
            Rx1 = nameArray[1];
            Ry1 = nameArray[2];
        }
    }

    private void label3_Click(object sender, EventArgs e)
    {

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        label3.Text = dot;
        posY.Text = Ry1;
        posX.Text = Rx1;
    }
        //this.Invoke(new EventHandler(DisplayText));
    }


}

我仍然是C#的新手,但對它的了解不是很好。.所以我需要幫助。 之前感謝。

您確定要通過數據接收方法獲取完整的數據包嗎? 如果不是,則需要緩沖它們以確保其正常工作。

您可以嘗試這樣的事情。

// A buffer for the incoming data strings.
string buffer = string.Empty;

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  // buffer up the latest data.
  buffer += serialPort1.ReadExisting();;

  // there could be more than one packet in the data so we have to keep looping.
  bool done = false;
  while (!done)
    {
       // check for a complete message.
       int start = buffer.IndexOf(":");
       int end = buffer.IndexOf(";");
       if (start > -1 && end > -1 && start < end)
       {
          // A complete packet is in the buffer.
          string packet = buffer.Substring(start + 1, (end - start) - 1);

          // remove the packet from the buffer.
          buffer = buffer.Remove(start, (end - start) + 1);

          // split the packet up in to it's parameters.
          string[] parameters = packet.Split('*');
          rx1 = parameters[0];
          ry1 = parameters[1];
          dot = parameters[2];

       }
    else
       done = true;
}

如果讀取后僅獲得一小塊數據。 例如:1*895*123;

TestText = serialPort1.ReadExisting();//:1*895*123;
string[] nameArray = TestText.Split(new []{":", "*", ";"}, StringSplitOptions.RemoveEmptyEntries);
label3.Text = nameArray[0];//1
posY.Text = nameArray[1];  //895
posX.Text = nameArray[2];  //123

如果您收到:1*895*123; :1*987*145; :1*895*123; :1*987*145;

var chunks = s.Split(new [] { ":", ";", " "}, StringSplitOptions.RemoveEmptyEntries);
foreach (var chunk in chunks)
{
   string[] data = chunk.Split(new [] { "*" }, StringSplitOptions.RemoveEmptyEntries);
   label3.Text = data[0];
   posY.Text = data[1];  
   posX.Text = data[2];  
}

但是,在標簽中,您只會看到最新的塊數據,因此需要存儲數據列表。 例如,您可以創建類:

class chunkData
{
    public string dot;
    public string posX;
    public string posY;
}

並像這樣使用它:

private List<chunkData> dataList = new List<chunkData>();
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   TestText = serialPort1.ReadExisting();
   var chunks = TestText.Split(new [] { ":", ";", " "}, StringSplitOptions.RemoveEmptyEntries);
   foreach (var chunk in chunks)
   {
      string[] data = chunk.Split(new [] { "*" }, StringSplitOptions.RemoveEmptyEntries);
      dataList.Add(new chunkData(){dot=data[0], posX=data[1], posY=data[2]})
   }
   //display dataList to DataGridView or other control
}

編輯 :如果您通過符號接收數據,這是您可以做的事情:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string temp = serialPort1.ReadExisting();
   if(temp == ";") //OK we have end of data lets process it
      splitAndDisplay();
   else
      TestText += temp; 
}

private void splitAndDisplay()
{
   string[] nameArray = TestText.Split(new []{":", "*"}, StringSplitOptions.RemoveEmptyEntries);
   this.Invoke(new Action(() =>
     {
       label3.Text = nameArray[0];
       posY.Text = nameArray[1];  
       posX.Text = nameArray[2];
      }));
   TestText = "";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM