C# - Чтение последовательных данных из MSP430 и отображение на диаграмме

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

Скриншот: Данные о температуре из MSP430 в консоли

Интересны только каждые 3 числа. Забудьте установить его на «WriteLine»

Итак, мой следующий шаг — прочитать данные в форму и отобразить их на диаграмме. Это тот момент, когда я не нашел свою ошибку. Диаграмма получает правильное первое значение, а затем возвращается к нулям. Я думаю, что это ошибка в моей функции потока, но я совершенно не знаком с потоками, поэтому не могу найти ошибку.

Надеюсь, вы поможете мне исправить это!

Далее я покажу вам код, работающий на моем MSP430, написанный в «Энергии».

int temp;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Internal Temperature Sensor\n");
}

void loop()
{
  // put your main code here, to run repeatedly:
  temp = analogRead(TEMPSENSOR);
  Serial.print(temp);
  delay(5000);
}

И следующий мой код С#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

using System.IO.Ports;
using System.Threading;

namespace SerialReadGUI
{
  public delegate void emptyFunction();
  public partial class Form1 : Form

  {
    public Form1()
    {
        InitializeComponent();
        double[] pointsArray = { };

        chart1.ChartAreas.Add("areas");
        chart1.ChartAreas["areas"].AxisX.Minimum = 0;
        chart1.ChartAreas["areas"].AxisX.Interval = 1;
        chart1.ChartAreas["areas"].AxisY.Minimum = 20;
        chart1.ChartAreas["areas"].AxisY.Interval = 0.1;
        chart1.ChartAreas["areas"].AxisY.Maximum = 40;
        chart1.ChartAreas["areas"].AxisX.Title = "Time [s]";
        chart1.ChartAreas["areas"].AxisY.Title = "Temperature [°C]";

        chart1.Series.Add("Temperature");
        chart1.Series["Temperature"].Color = Color.Red;
        chart1.Series["Temperature"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;

        chart1.Titles.Add("Internal Temeperatur Sensor");

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        SerialPort mySerialPort = new SerialPort("COM4");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceiveHandler);

        mySerialPort.Open();



    }

    private void DataReceiveHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;

        string indata = sp.ReadExisting();
        double temp = Double.Parse(indata);
        temp = temp / 10;
        string time = DateTime.Now.ToShortTimeString();                     

        Thread thread = new Thread(() => ChartAdd(time, temp));
        thread.IsBackground = true;
        thread.Start();
    }

    private void ChartAdd(string x, double y)
    {
        chart1.Invoke(new emptyFunction(delegate ()
        {
            chart1.Series["Temperature"].Points.AddXY(x, y);
        }));
    }
  }
}

Результат всего этого кода таков, но, как вы видите на первом рисунке, он получает правильные значения в консоли.

Скриншот: данные температуры от MSP430 на диаграмме

Ждем ваших идей =)


person Benjamin Hagels    schedule 06.08.2015    source источник
comment
Не уверен, что они будут полезны в любом случае, но размещение материалов на гугл-диске не очень полезно, имхо.   -  person TaW    schedule 06.08.2015
comment
Есть ли другие способы поделиться фотографиями? Мне не разрешено публиковать их в вопросе, потому что у меня мало репутации.   -  person Benjamin Hagels    schedule 06.08.2015


Ответы (1)


Починил это:

В Энергии пришлось изменить вот это:

Serial.print(temp);

To:

Serial.println(temp);

И в моем коде С# я изменил это:

string indata = sp.ReadExisting();

To:

string indata = sp.ReadTo("\r");

Теперь я получаю правильные значения в своей диаграмме!

person Benjamin Hagels    schedule 07.08.2015