2012-05-31 2 views
1

Я хочу создать графический интерфейс для моего устройства, чтобы показать значение каждого датчика. Мое устройство передачи данных с этим форматомC# Чтение Последовательные данные от датчика

: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# и не очень хорошо с ним .. поэтому мне нужна помощь. спасибо раньше.

+0

«не работает» - каким образом? что случилось? что вы ожидали? Также: 'ReadExisting()' - вы проверяете правильное разделение сообщений? –

+0

Я хочу получить данные датчика и показать его на моем графическом интерфейсе .. но так или иначе, этот мой графический интерфейс может отображать только 1 символ за раз. и это делает я не могу использовать его, потому что данные были неправильными. –

+0

, чтобы прояснить это. Я хочу сделать некоторый графический интерфейс для моего датчика ИК-камеры Wii. Я извлек данные, используя arduino, и отправлю данные, подобные этому формату, который равен 1 для количества обнаруженных IR, 895 - позиция X IR, а 123 - Y-позиция IR. теперь я просто путаюсь, как собрать этот поток данных и разделить его, чтобы поместить его на каждую переменную. –

ответ

1

Вы уверены, что получаете полные пакеты в полученном методе данных? если нет, вам нужно будет их буксировать, чтобы убедиться, что он работает правильно.

Вы можете попробовать что-то вроде этого.

// 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; 
} 
+0

вопрос, как я могу вызвать данные по параметру1,2,3, чтобы я мог показать его на ярлыке? поскольку параметр1,2,3 не является общедоступным, я думаю .. –

+0

Вы можете просто проигнорировать их, если хотите, и установить строки уровня класса Rx1, Ry1, dot. rx1 = параметры [0]; ry1 = параметры [1]; dot = параметры [2]; – Andy

+0

Я обновил код, чтобы показать, что я имею в виду. – Andy

0

Если вы получили только один кусок данных после прочтения. Например :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;

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 
} 

EDIT: вот что вы можете сделать, если прием символа данных символом:

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 = ""; 
} 
+0

Фактически данные будут продолжаться до тех пор, пока я не отключу свое устройство или не закрою программу. и он будет зацикливаться на разных данных, когда мой датчик обнаружит некоторые изменения. –

+0

Что такое значение 'TestText' после' TestText = serialPort1.ReadExisting(); '? – Reniuz

+0

один символ за раз. если я использую программу здесь, [link] (http://csharp.simpleserial.com/), она будет отображаться как то, что я публикую, но когда я делаю 'posX.Text = TestText', он покажет 1 символ и будет меняться согласно потоку. –

Смежные вопросы