ボタンをクリックするだけで PC のシリアル ポートを介してマイクロに命令を送信するアプリケーションがあります。その後、マイクロは、データ受信イベント ハンドラーを起動するデータをストリーム バックします。これは文字列に取り込まれます。
この時点で、文字列のデータを使用して、リストビュー ボックスに入力したいと考えています。私はまだデータ受信スレッドにいるので、invoke、delegate を使用してこれを行うことができます。
スレッドが終了した後にこれを行うためにイベント ハンドラーまたは単純なルーチンを呼び出す方法はありますか? ボタンによってトリガーされた場合、ルーチンの構築は正常に機能しますが、タスクを完了するためにプログラムで呼び出したいと思います。
それが十分に明確であることを願っています、それは私の最初の投稿です。
編集:ここにいくつかのサンプルコードがあります -
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;
}
}
文字列テキストの最初のバイトは、入ってきたものに関する識別子です。これは、データ受信スレッド内での実行時に、invoke delegate メソッドを使用して、メイン フォームにラベルを設定する関数を呼び出します。ダウンロード データ関数への既定の呼び出しでは、テキストが渡され、イベントの塊であるため、テキストが並べ替えられます。結果は、リストビュー ボックスの関連する列に渡されます。インボーク デリゲート メソッドの使用を避けたいと考えています。これを行うには 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;
}
}