C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataReceivedイベントでの例外エラー

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■100246 / inTopicNo.1)  DataReceivedイベントでの例外エラー
  
□投稿者/ 初心者侍 (1回)-(2022/07/13(Wed) 10:36:11)
初心者侍 さんの Web サイト

分類:[C#] 

添付のサイトを参考に一定期間の間シリアル通信でデータを受信し、そのデータをいろいろと操作した後画面に表示するプログラムを組んだのですが例外エラーを吐きます。
エラーの発生頻度は毎回ではなくランダムに発生するようです。
例外の内容は「System.IO.IOException:スレッドの終了またはアプリケーションの要求によって、IO処理は中止されました。」とあります。
エラーの発生個所になりますが以下の「string data = serialPort1.ReadLine();」の部分になります。
何か考えられる対策がありましたらご教授ください。

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string data = serialPort1.ReadLine();
   Response(data);
}

引用返信 編集キー/
■100247 / inTopicNo.2)  Re[1]: DataReceivedイベントでの例外エラー
□投稿者/ radian (70回)-(2022/07/13(Wed) 10:43:14)
読み込もうとしたタイミングで、ポート既に閉じてたりしないですか?
try-catchで例外処理して、ブレークポイント設定してデバッグするかログ取るかして
例外発生時のserialPort1の状態を確認してみてください。
引用返信 編集キー/
■100248 / inTopicNo.3)  Re[1]: DataReceivedイベントでの例外エラー
□投稿者/ WebSurfer (2528回)-(2022/07/13(Wed) 10:52:07)
No100246 (初心者侍 さん) に返信

> 添付のサイトを参考に

ネットに公開されているならその URL を書いてください。
引用返信 編集キー/
■100249 / inTopicNo.4)  Re[1]: DataReceivedイベントでの例外エラー
□投稿者/ 初心者侍 (2回)-(2022/07/13(Wed) 10:56:58)
初心者侍 さんの Web サイト
No100246 (初心者侍 さん) に返信
> 添付のサイトを参考に一定期間の間シリアル通信でデータを受信し、そのデータをいろいろと操作した後画面に表示するプログラムを組んだのですが例外エラーを吐きます。
> エラーの発生頻度は毎回ではなくランダムに発生するようです。
> 例外の内容は「System.IO.IOException:スレッドの終了またはアプリケーションの要求によって、IO処理は中止されました。」とあります。
> エラーの発生個所になりますが以下の「string data = serialPort1.ReadLine();」の部分になります。
> 何か考えられる対策がありましたらご教授ください。
>
> private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
> {
> string data = serialPort1.ReadLine();
> Response(data);
> }

参考にしたサイトは以下の通りです。すみません。
https://qiita.com/mag2/items/d15bc3c9d66ce0c8f6b1
引用返信 編集キー/
■100250 / inTopicNo.5)  Re[2]: DataReceivedイベントでの例外エラー
□投稿者/ 初心者侍 (3回)-(2022/07/13(Wed) 11:00:08)
初心者侍 さんの Web サイト
No100247 (radian さん) に返信
> 読み込もうとしたタイミングで、ポート既に閉じてたりしないですか?
> try-catchで例外処理して、ブレークポイント設定してデバッグするかログ取るかして
> 例外発生時のserialPort1の状態を確認してみてください。

返信ありがとうございます。
ポートは閉じていないはずなんですが確認してみます。
serialPort1の状態はどこで確認できるんですか?
無知ですみません。
引用返信 編集キー/
■100251 / inTopicNo.6)  Re[3]: DataReceivedイベントでの例外エラー
□投稿者/ radian (71回)-(2022/07/13(Wed) 11:27:08)
2022/07/13(Wed) 11:30:08 編集(投稿者)

No100250 (初心者侍 さん) に返信
> ■No100247 (radian さん) に返信
>>読み込もうとしたタイミングで、ポート既に閉じてたりしないですか?
>>try-catchで例外処理して、ブレークポイント設定してデバッグするかログ取るかして
>>例外発生時のserialPort1の状態を確認してみてください。
>
> 返信ありがとうございます。
> ポートは閉じていないはずなんですが確認してみます。
> serialPort1の状態はどこで確認できるんですか?
> 無知ですみません。

SerialPortクラスのドキュメントのプロパティの所を読んでください。
知らないのは最初は誰しもそうなので全く問題無いのですが、
基本的な所は、自分でドキュメントを調べる癖を付けましょう。
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport
引用返信 編集キー/
■100255 / inTopicNo.7)  Re[1]: DataReceivedイベントでの例外エラー
□投稿者/ kiku (281回)-(2022/07/13(Wed) 14:25:02)
No100246 (初心者侍 さん) に返信
> 添付のサイトを参考に一定期間の間シリアル通信でデータを受信し、そのデータをいろいろと操作した後画面に表示するプログラムを組んだのですが例外エラーを吐きます。
> エラーの発生頻度は毎回ではなくランダムに発生するようです。
> 例外の内容は「System.IO.IOException:スレッドの終了またはアプリケーションの要求によって、IO処理は中止されました。」とあります。
> エラーの発生個所になりますが以下の「string data = serialPort1.ReadLine();」の部分になります。
> 何か考えられる対策がありましたらご教授ください。
>
> private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
> {
> string data = serialPort1.ReadLine();
> Response(data);
> }

Responce(data)を削除して再現試験してもらえないですか?
Responseの処理が重すぎる場合に発生する場合があります。

引用返信 編集キー/
■100259 / inTopicNo.8)  Re[1]: DataReceivedイベントでの例外エラー
□投稿者/ KOZ (288回)-(2022/07/13(Wed) 15:24:53)
2022/07/13(Wed) 18:20:57 編集(投稿者)
<pre><pre>■No100246 (初心者侍 さん) に返信

> private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
> {
>    string data = serialPort1.ReadLine();
>    Response(data);
> }

ReadLine だと、'\n' を受信するまで待機します。

「SerialPort.ReadLine メソッド」
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport.readline?view=dotnet-plat-ext-6.0

にあるように、 ReadTimeout プロパティを設定して、 TimeoutException が発生するようにしたほうが良いです。

私だったら、

private readonly StringBuilder buffer = new StringBuilder();

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) {
    SerialPort port = (SerialPort)sender;
    string recieveData = port.ReadExisting();
    lock (buffer) {
        foreach (char c in recieveData) {
            if (c == '\n') {
                BeginInvoke((Action<string>)Response, buffer.ToString());
                buffer.Clear();
            } else {
                buffer.Append(c);
            }
        }
    }
}

private void Response(string text) {
    textBox1.AppendText(text + "\n");
}

のように、受信済みのデータのみ処理するよう作ると思います。

引用返信 編集キー/
■100260 / inTopicNo.9)  Re[2]: DataReceivedイベントでの例外エラー
□投稿者/ radian (73回)-(2022/07/13(Wed) 15:45:13)
No100259 (KOZ さん) に返信
> 2022/07/13(Wed) 15:25:19 編集(投稿者)
>
> ■No100246 (初心者侍 さん) に返信
>
>>private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
>>{
>> string data = serialPort1.ReadLine();
>> Response(data);
>>}
>
> ReadLine だと、'\n' を受信するまで待機します。
>
> 「SerialPort.ReadLine メソッド」
> https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport.readline?view=dotnet-plat-ext-6.0
>
> にあるように、 ReadTimeout プロパティを設定して、 TimeoutException が発生するようにしたほうが良いです。

タイムアウト設定しなかった場合は無限に待つだけであって、質問の問題であるIOExceptionにはならないと思いますが。

引用返信 編集キー/
■100261 / inTopicNo.10)  Re[3]: DataReceivedイベントでの例外エラー
□投稿者/ KOZ (289回)-(2022/07/13(Wed) 16:02:41)
No100260 (radian さん) に返信
> タイムアウト設定しなかった場合は無限に待つだけであって、質問の問題であるIOExceptionにはならないと思いますが。

メソッドに入る前に Port が閉じられていれば、InvalidOperationException ですよね?

待ってる間に Port が閉じられると、IOException になるのかなと思ったので、
発生する可能性を少なくするためのロジックを提示したわけです。

引用返信 編集キー/
■100263 / inTopicNo.11)  Re[4]: DataReceivedイベントでの例外エラー
□投稿者/ radian (74回)-(2022/07/13(Wed) 16:14:25)
2022/07/13(Wed) 16:22:04 編集(投稿者)

No100261 (KOZ さん) に返信
> ■No100260 (radian さん) に返信
>>タイムアウト設定しなかった場合は無限に待つだけであって、質問の問題であるIOExceptionにはならないと思いますが。
>
> メソッドに入る前に Port が閉じられていれば、InvalidOperationException ですよね?
>
> 待ってる間に Port が閉じられると、IOException になるのかなと思ったので、
> 発生する可能性を少なくするためのロジックを提示したわけです。

であれば、面倒でもロジックと一緒に何故そうしているかの説明を書いた方がいいですよ。
初心者と書いてる人に、説明すっ飛ばしてロジックだけ書くのは良くないです。
引用返信 編集キー/
■100264 / inTopicNo.12)  Re[4]: DataReceivedイベントでの例外エラー
□投稿者/ KOZ (290回)-(2022/07/13(Wed) 16:30:36)
使われている場所が工場のようなノイズが発生しやすいところだったり、
結線をカチャカチャやったりすると変な受信データが発生したり、エラーが発生します。

ErrorReceived イベントが発生していないかもチェックしたほうがいいと思います。

引用返信 編集キー/
■100266 / inTopicNo.13)  Re[5]: DataReceivedイベントでの例外エラー
□投稿者/ KOZ (291回)-(2022/07/13(Wed) 16:44:16)
No100263 (radian さん) に返信
> であれば、面倒でもロジックと一緒に何故そうしているかの説明を書いた方がいいですよ。
> 初心者と書いてる人に、説明すっ飛ばしてロジックだけ書くのは良くないです。

疑問に思うことがあれば質問してくると思います。
そういう人にはつきあいます。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ