質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.26%

C# シリアル通信 送信途中でなぜか例外が発生してしまいます。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 92

hachimitu

score 19

問題

シリアル通信でpcから送信処理のタイミングで下画像のようなエラーが出ることがあります。
100msec周期で送信処理をしており、100msec周期送信開始して1分ぐらいたつといきなりエラーが表れてしまいます。
逆にそれまでは正常に動作しています。
原因が全く分からない状態です。どなたか意見ありますでしょうか。宜しくお願い致します。
![イメージ説明](03cea8ada8c543ae02af36b4de0eb9b8.png)

        /*INTERVAL_TIMEmsec毎に呼ばれる送信用タイマイベント*/
        private void Timer_event_handler(object sender, ElapsedEventArgs e)
        {
            UART_SendData(st_tx_buffer.buffer, total_size);
        }

        private void UART_SendData(byte[] bData, int nLength)
        {
            /*ポートオープン時にのみ送信するため*/
            if( serialPort1.IsOpen == true )
            {
                serialPort1.Write(bData, 0, nLength);
                /*別スレッドからコントロールボックスを操作する場合にinvokeを使う*/
                BeginInvoke(new Delegate_DataToTxtBox(SendDataToTextBox),
                                    new Object[] { bData, nLength });
            }
            else { /*nothing*/}

        }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Q71

    2020/05/23 20:19

    詳細の表示をして、InnerExceptionがないか、調べてください。

    キャンセル

  • soi013

    2020/05/23 22:08

    C#にはTimerが何種類もあるのですが、System.Timers.Timerでしょうか?

    キャンセル

  • hachimitu

    2020/05/24 11:46

    >dodox86
    回答ありがとうございます!
    なるほど、ちょっと試してみます。
    >Q71
    InnerException null
    と表示していました。

    >soi013
    はい、System.Timer.Timerです。
    "System.Timers.ElapsedEventHandler(Timer_event_handler";

    キャンセル

回答 1

0

Timer_event_handlerが2重に走ったことが原因かもしれません。
System.Timer.TimerのElapsedイベントは再入可能な処理を書く必要があります。
https://www.atmarkit.co.jp/ait/articles/0511/11/news119.html

解決選択肢としては3つが考えられます。

  • Timerをやめて、無限ループでawait Task.Delay(100)などで待つ
  • System.Timers.Timerをやめて、System.Windows.Forms.Timerに変更する(こちらは再入されない)
  • TimerのAutoResetをfalseにして、イベントハンドラ内で再スタートする

最後だけ詳細に書きます。

//Timer 生成時
Timer timer = new Timer(){ AutoReset = False, Interval = 100};

private void Timer_event_handler(object sender, ElapsedEventArgs e)
        {
            UART_SendData(st_tx_buffer.buffer, total_size);
            timer.Start();
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.26%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる