У меня есть приложение, в котором я посылаю инструкцию на микро через последовательный порт ПК нажатием кнопки. Затем микропоток передает данные, которые запускают обработчик обработанных данных. Это захватывается в строку.Заполнение списка после запуска потока последовательного порта
На данный момент я хочу использовать данные строки и заполнить свой список. Я могу сделать это, используя invoke, делегировать, потому что я все еще в потоке данных.
Можно ли каким-либо образом вызвать обработчик событий или простую процедуру, чтобы сделать это после выхода потока, так что мне не нужно использовать invoke, delegate? Строение подпрограмм работает нормально, если оно запускается кнопкой, но я бы хотел, чтобы он был запрограммирован для выполнения задачи.
Надеюсь, что это достаточно ясно, это мой первый пост.
Edit: Вот некоторые примеры кода -
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//use 28591 or("ISO-8859-1") to cover all hex bytes from 0 - 255
serialPort1.Encoding = Encoding.GetEncoding(28591);
//wait for download to complete by monitoring cts line
if (HoldData == true)
{
while (serialPort1.CtsHolding == true) ;
HoldData = false;
}
else
Thread.Sleep(50);
string text = serialPort1.ReadExisting();
switch (text[0])
{
case '?': MemLabelUpdate(); break;
case '>': WriteConfig(text); break;
case '=': SealTest(text); break;
case '<': CurrentNumber(text); break;
default: DataDownload(text); break;
}
}
Первый байт строки текста является идентификатором, как к тому, что пришел в это, в свою очередь, вызывает функцию, которая заполнит Lables на главном. формы с использованием метода делегирования invoke в качестве его запуска в потоке, полученном данными. По умолчанию вызов функции загрузки данных проходит текст и сортирует его, поскольку это масса событий. Затем результаты передаются в поле списка в соответствующие столбцы. Я хочу уйти от использования метода делегирования invoke. Мне нужно выйти из port_datareceived потока, чтобы сделать это, и после выхода введите мою функцию, чтобы просто обновить список, как показано ниже. Как я могу запускать этот вид события программно.
private void btnDisplayData_Click(object sender, EventArgs e)
{
int SectionStart = 10;
int SectionEnd = 8;
listView1.Items.Clear();
listView1.View = View.Details;
listView1.GridLines = true;
//Add columns to listview
listView1.Columns.Add("Event", 80, HorizontalAlignment.Center);
listView1.Columns.Add("Time", 80, HorizontalAlignment.Center);
listView1.Columns.Add("Date", 80, HorizontalAlignment.Center);
//Print results to listview box
ListViewItem ListItem;
for (int i = 0; i < 10; i++)
{
ListItem = listView1.Items.Add(DownloadedData.Substring(SectionStart, SectionEnd));
SectionStart += 8;
ListItem.SubItems.Add(DownloadedData.Substring(SectionStart, SectionEnd));
SectionStart += 8;
ListItem.SubItems.Add(DownloadedData.Substring(SectionStart, SectionEnd));
SectionStart += 8;
}
foreach (ColumnHeader column in listView1.Columns)
{
column.Width = -2;
}
}
Необходимо выяснить вопрос: какие темы вы используете, используете ли вы класс C# SerialPort, в каком потоке вы создаете объект SerialPort. – Ryan
Покажите нам соответствующий код и немного объясните, как вы хотите, чтобы он работал по-другому. Трудно сказать, что вы действительно просите здесь. –