Я пытался и много читал, но сейчас я стою на месте. У меня есть 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 на диаграмме
Ждем ваших идей =)