visual unity studio serial recibir proyectos exportar enviar datos datareceived comunicacion c# graph charts arduino serial-port

unity - recibir datos de arduino en c#



Cómo trazar gráficos con datos de un SerialPort con múltiples sensores (1)

Necesito trazar los datos de los sensores de pH, temperatura y humedad, los datos se envían como una matriz desde Arduino a PC a través del puerto serie.

Puedo mostrar los datos en un TextBox, pero cuando trato de trazar los datos, no funciona (no sé cómo hacerlo).

Solo puedo trazar los datos cuando no es una matriz y son datos de solo un sensor.

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; using System.Threading.Tasks; using System.IO.Ports; using System.Windows.Forms.DataVisualization.Charting; namespace grafik1 { public partial class Form1 : Form { private SerialPort sensport; private DateTime datetime; private string data; private string data2; public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void Form1_Load(object sender, EventArgs e) { comboBox1.DataSource = SerialPort.GetPortNames(); timer1.Start(); } double rt = 0; Boolean i = false; private void timer1_Tick(object sender, EventArgs e) { rt = rt + 0.1; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { sensport.Close(); } private void button1_Click(object sender, EventArgs e) { if (comboBox2.Text == "") { MessageBox.Show("Error"); } else { sensport = new SerialPort(); sensport.BaudRate = int.Parse(comboBox2.Text); sensport.PortName = comboBox1.Text; sensport.Parity = Parity.None; sensport.DataBits = 8; sensport.StopBits = StopBits.One; sensport.Handshake = Handshake.None; sensport.DataReceived += sensport_DataReceived; try { sensport.Open(); textBox1.Text = ""; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); } } } void sensport_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (i == false) { rt = 0; i = true; } data = sensport.ReadLine(); this.chart1.Series["Data1"].Points.AddXY(rt, data); this.Invoke(new EventHandler(displaydata_event)); } private void displaydata_event(object sender, EventArgs e) { datetime = DateTime.Now; string time = datetime.Day + "/" + datetime.Month + "/" + datetime.Year + "/t" + datetime.Hour + ":" + datetime.Minute + ":" + datetime.Second; txtData.AppendText(time + "/t" + data + "/n"); } private void button2_Click(object sender, EventArgs e) { string directorio = textBox1.Text; if (directorio == "") { MessageBox.Show("Error"); } else { try { string kayıtyeri = @"" + directorio + ""; this.chart1.SaveImage(("+kayityeri+"), ChartImageFormat.Png); MessageBox.Show("Grafica guardada en " + kayıtyeri); } catch (Exception ex3) { MessageBox.Show(ex3.Message, "Error"); } } } private void label4_Click(object sender, EventArgs e) { } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { sensport.Close(); } private void button4_Click(object sender, EventArgs e) { try { string pathfile = @"C:/Users/MARIO GONZALEZ/Google Drive/VisualStudio/Arduino0_1/DATA"; string filename = "arduinoRTPv1.xls"; System.IO.File.WriteAllText(pathfile + filename, txtData.Text); MessageBox.Show("Data saved"); } catch (Exception ex3) { MessageBox.Show(ex3.Message, "Error"); } } private void button5_Click(object sender, EventArgs e) { } private void chart1_Click(object sender, EventArgs e) { } } }


Supongamos que ha preparado su tabla, tal vez así:

chart1.Series.Clear(); chart1.Series.Add("ph"); chart1.Series.Add("Temp"); chart1.Series.Add("Hum"); chart1.Series["ph"].ChartType = SeriesChartType.Line; chart1.Series["Temp"].ChartType = SeriesChartType.Line; chart1.Series["Hum"].ChartType = SeriesChartType.Line; chart1.ChartAreas[0].AxisY2.Enabled = AxisEnabled.True; chart1.ChartAreas[0].AxisY2.Title = "Temp"; chart1.ChartAreas[0].AxisY2.Maximum = 100;

Ahora puede agregar una cadena que contenga algunos bloques de datos como se muestra en los comentarios.

string data = "7.5 23.8 67 /n8.5 23.1 72 /n7.0 25.8 66 /n";

..Me gusta esto:

var dataBlocks = data.Split(''/n''); foreach (var block in dataBlocks) { var numbers = block.Split(new [] {'' ''}, StringSplitOptions.RemoveEmptyEntries); // rt += someTime; (*) for (int i = 0; i < numbers.Length; i++) { double n = double.NaN; bool ok = double.TryParse(numbers[i], out n); if (ok) chart1.Series[i].Points.AddXY(rt, n); else { int p = chart1.Series[i].Points.AddXY(rt, 0); chart1.Series[i].Points[p].IsEmpty = true; Console.WriteLine("some error message.."); } } }

He modificado un poco los datos para mostrar un poco mejor los cambios.

  • Tenga en cuenta que omite el conteo de su temporizador rt , que es la razón por la cual el gráfico muestra los puntos con valores x indexados. Para una trama real en tiempo real, inclúyela aquí (*).

Si continúa agregando datos, su cuadro pronto se llenará bastante.

A continuación, deberá eliminar los datos anteriores desde el principio o, al menos, establecer un valor x mínimo y máximo para restringir la visualización a un número razonable de puntos de datos y / o activar el zoom.

¡Mira aquí aquí y aquí para ver algunos ejemplos y discusiones de estas cosas!