class MyClassA
{
public ObservableCollection<AnotherClass> ListCode { get; private set; };
public MyClassA()
{
// ...
ListCode = new ObservableCollection<AnotherClass>();
}
public void GetList()
{
ListCode.Clear();
// ...
ListCode.Add(new AnotherClass());
}
}
DataCompleadEventArgs.csописываете класс события:
namespace MyNamespace
{
public delegate void DataCompleadEventHandler(object sender, DataCompleadEventArgs e);
public class DataCompleadEventArgs : EventArgs
{
private string _data;
public DeviceEventArgs (string data)
{
_data; = data
}
public string Data
{
get { return _data; }
}
}
}
MySerialPortпишите следующее:
public class MySerialPort : SerialPort
{
// ваш код ...
// обьявляете событие
public event DataCompleadEventHandler DataComplead;
// описываете функцию, чтоб слать событие наружу
private void OnDataComplead(string message)
{
if (DataComplead != null)
{
DataComplead(this, new DataCompleadEventArgs(message));
}
}
public MySerialPort() :base()
{
// ваш код ...
base.DataReceived += new SerialDataReceivedEventHandler(MySerialPort_DataReceived);
}
void MySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// то, что тут было написано не нужно !!!
var port = (SerialPort)sender;
try
{
// ваш код ...
var message = Convert.ToString(rbt);
if (_stepIndex == buferSize)
{
// шлём событие наружу
OnDataComplead(message );
}
}
catch { }
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ...
}
private void button2_Click(object sender, EventArgs e)
{
var port = new MySerialPort();
// подписиваемся на событие
port.DataComplead += OnDataCompleated;
port.Open(comboBox1.SelectedItem.ToString());
}
private void OnDataCompleated(object sender, DataCompleadEventArgs e)
{
// получаем нужные данные
var message = e.Data;
writeTB1(message);
}
}
// Наследуем наш клас от SerialPort для более красивого кода
public class MySerialPort : SerialPort
{
private const int DataSize = 54; // я так и не понял, какой размер данных нужен. Укажите правильное число в байтах
private readonly byte[] _bufer = new byte[DataSize];
private int _stepIndex;
private bool _startRead;
public MySerialPort(string port)
: base()
{
// все папаметры вы должны указать в соответствии с вашим устройством
//base.PortName = COM1;
base.BaudRate = 115200;
base.DataBits = 8;
base.StopBits = StopBits.Two;
base.Parity = Parity.None;
base.ReadTimeout = 1000;
// тут подписываемся на событие прихода данных в порт
// для вашей задачи это должно подойт идеально
base.DataReceived += SerialPort_DataReceived;
}
// открываем порт передав туда имя
public void Open(string portName)
{
if (base.IsOpen)
{
base.Close();
}
base.PortName = portName;
base.Open();
}
// эта функция вызвется каждый раз, когда в порт чтото будет передано от вашего устройства
void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var port = (SerialPort)sender;
try
{
// узнаем сколько байт пришло
int buferSize = port.BytesToRead;
for (int i = 0; i < buferSize; ++i)
{
// читаем по одному байту
byte bt = (byte)port.ReadByte();
// если встретили начало кадра (0xFF) - начинаем запись в _bufer
if (0xFF == bt)
{
_stepIndex = 0;
_startRead = true;
// раскоментировать если надо сохранять этот байт
//_bufer[_stepIndex] = bt;
//++_stepIndex;
}
// дописываем в буфер все остальное
if (_startRead)
{
_bufer[_stepIndex] = bt;
++_stepIndex;
}
// когда буфер наполнлся данными
if (_stepIndex == DataSize && _startRead)
{
// по идее тут должны быть все ваши данные.
// .. что то делаем ...
// var item = _bufer[7];
_startRead = false;
}
}
}
catch {}
}
}
var port = new MySerialPort();
port.Open("COM5");