Jak správně synchronizovat čtená data z RS232 (Inputs), abych je mohl použít v cyklických výpočtech v timer1_Tick() ? Pro zobrazení na hlavním formuláři používám InvokeRequired (funkce SetText), ale jak na další data, která chci dále používat ve výpočtech? diky
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.IO.Ports;
namespace WindowsFormsApplication1
{
// vstupni data, ktera se ctou z RS232
public class InputData
{
public int varInt;
public char varChar;
public object[] varOther;
// vypreparovani dat ze stringu nacteneho z R232
public void FromString(string xStr)
{
if ((xStr != String.Empty) && (xStr.Length > 2))
{
varChar = xStr[0];
varInt = int.Parse(xStr.Substring(1, 2));
}
}
}
// vystupni data, ktera zapisuji na RS232
public class OutputData
{
public int varInt;
public string varStr;
public object[] varOther;
// vygenerovani stringu pro poslani na RS232
public override string ToString()
{
return string.Format("{0}={1}", varStr, varInt);
}
}
public partial class Form1 : Form
{
private SerialPort port;
private InputData Inputs;
private OutputData Outputs;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Inputs = new InputData();
Outputs = new OutputData();
port = new SerialPort("COM1");
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string InputData = port.ReadExisting();
Inputs.FromString(InputData);
}
// timer po 100ms, kde budou probíhat výpočty
private void timer1_Tick(object sender, EventArgs e)
{
// vypocty nad daty
Outputs.varInt += Inputs.varInt + 1;
string s2 = Inputs.varChar.ToString().ToUpper() + "blablabla";
// zobrazeni dat
SetText(label1, string.Format("I.varInt={0}, O.varInt={1}", Inputs.varInt, Outputs.varInt));
// zapis na linku
port.Write(Outputs.ToString());
}
// pro thread-safety zobrazeni v Labelu
delegate void SetTextCallback(Label lbl, string text);
private void SetText(Label lbl, string text)
{
if (lbl.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { lbl, text });
}
else
lbl.Text = text;
}
}
}
|