私はSerialPortからのデータを表示し、TextBoxに表示する非常に簡単なプログラム(VS2010のC#WPFアプリケーション)で作業しています。このプログラムは、通常の状況で正常に動作します。しかし、ユーザーが接続を開いていくつかのデータを集めてからもう一度開いて数サイクル繰り返すと、プログラムは最終的に例外をスローします:WPFのSerialPortがI/O例外を投げた
"I/O操作はスレッド出口かアプリケーション要求のどちらかです。 " [ReadLine()でI/O例外が発生しました]
いつかプログラムが例外をスローします。ときどきプログラムがハングすることがあります。以下 は私のコードです:
/* Click to Open ComPort */
private void PortOpen_Click(object sender, RoutedEventArgs e)
{
if (!serialPort1.IsOpen)
{
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.ReceivedBytesThreshold = 1;
serialPort1.NewLine = "\r\n";
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.Handshake = Handshake.None;
serialPort1.Open();
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Receive);
}
}
/* Receive data from ComPort */
private void Receive(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (serialPort1.IsOpen)
{
try
{
string1 = serialPort1.ReadLine(); /* This is where I/O Exception occurred */
Dispatcher.Invoke(DispatcherPriority.Send, new UpdateUiTextDelegate(DisplayText), string1);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void DisplayText(string string1)
{
textBox1.Text = string1;
}
/* Close ComPort */
private void PortClose_Click(object sender, RoutedEventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
}
進展なしになり、過去40時間で私の頭バンギング-に対するテーブルの試みを要約次のとおりです。
- 私は
Open()
前後にThread.Sleep(3000)
を追加しようとしていますおよびClose()
。そして私はとても不満を持ち始め、私はThread.Sleep
をすべての1行の間に入れます。私はそれがバックグラウンドで未完成の仕事のための十分な時間を許すでしょう。問題を解決しません。 - 私はZach Saw's Postを試しました。ブログ記事に残っているコメントは非常に肯定的です。私はこのアプローチを試し、正確なコードをコピーして貼り付けることさえできました。問題を解決しません。私の一日の半分を無駄にした非常に長い投稿。
- キム・ハミルトンが問題に対処するhere。
Invoke
の代わりにBeginInvoke
を使用することをお勧めします。試してみても、同じ問題が残っています。 - 非常にいい商用のSerialPortライブラリFranson SerialToolsがありました。これはかなり安価で、何回の時間とどのくらいの速さでSerialPortをOpen()またはClose()するかにかかわらず、素晴らしいバグで動作します。しかし、彼らは開発を中止しており、WPFではなくフォームアプリケーションでしか動作していないライブラリです。 APIの引数の中には、Forms.Controlだけを受け入れるものもあります。残念な。他にも、市販品はそこにあるが、どちらか彼らは過度に販売されていますか、私はそれが動作するかどうかを知っているかないように自由な証跡を提供していないではない購入前
い誰.NET SERIALPORTが仕事と実際に確認してもらいますバグ(Open()とClose()は何度も何度も入っていますが、データが入っていなくても)?
MSDNのドキュメントは、あなたが、この文を使用してイベントハンドラにブロック読み込み置くべきではないことをほのめかす「一つだけのイベントハンドラを一度に実行することができます。」ハンドラでReadLineを使用しないことを強くお勧めします。 – dbasnett
@dbasnett、良い点、私は仕事をしてスレッドを作成する必要があると思います。 – KMC
利用可能なバイトを読み取って、それらのバイトを別のスレッドの処理のためにキューに入れないのはなぜですか?この方法では、改行を手動で検出する必要があります。 – dbasnett