none
シリアルポート受信した時画面遷移させる方法 RRS feed

  • 質問

  • VisualBasic2010のSerialPort.DataReceivedイベントを使用してデータ受信をし

    変数に受信内容を格納するプログラムを作成しました。

    ここまでは問題ないのですが,変数に受信内容を格納した後に次画面に遷移させたいのですが

    次画面に遷移させたときにアプリケーションの動作が処理中の状態のまま変わりません。

    何が問題なのかよろしくご教授お願いいたします。

    (参考)

    Delegate Sub AddDataDelegate(ByVal str As String)

    Private Sub AddData(ByVal str As String)

         Dim a As String 

           NextGamen.Show()

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As  

    System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

            Dim strDataReceived As String

            Dim add As New AddDataDelegate(AddressOf AddData)

            Try

                SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932)

                strDataReceived = SerialPort1.ReadExisting

                Catch ex As Exception

                strDataReceived = ex.Message

            End Try

            Invoke(add, strDataReceived)

    End Sub

    2013年1月16日 12:01

回答

  • 外池と申します。小生の経験に基づく説明で恐縮ですが、参考になれば幸いです。

    DataReceivedイベントは、ポートからの読み取りを試みるキッカケとして使うべきであって、プログラムの動作全体を制御するものとしてはアテにするべきでないと思います。DataReceivedイベントの発生する条件は、ドキュメントを見ても「OS次第」ということが書いてあって、ポートを通じてやりとりされる通信のプロトコルを反映したものにはならないと考えるべきです。

    「1行読み取れたら次へ」とか、「何文字読み取れたら次へ」というように、読み取ったデータがプロトコルに照らして一通り揃ったことをもって次へ進むように、プログラムすると確実だと思います。

    • 回答の候補に設定 佐伯玲 2013年1月23日 1:01
    • 回答としてマーク 佐伯玲 2013年1月24日 1:23
    2013年1月17日 0:41
  • VisualBasic2010のSerialPort.DataReceivedイベントを使用してデータ受信をし、変数に受信内容を格納するプログラムを作成しました。

    ここまでは問題ないのですが,変数に受信内容を格納した後に次画面に遷移させたいのですが、次画面に遷移させたときにアプリケーションの動作が処理中の状態のまま変わりません。

    何が問題なのかよろしくご教授お願いいたします。

     この後ろにコードがありますが、まず、

    • どのようなことを
    • どのような順番で

    行えば、目的が達せられると考えましたか?プログラミングの肝はこれなので、これが間違えていれば、「期待している動作」とはなりません。まず、手順が間違えているのか、それともコードが間違えているのか、そこの切り分けからはじめませんか?

     また、「アプリケーションの動作が処理中の状態のまま変わりません」を、もっと詳しく説明してください。今の状態ですと、次のようなことが考えられます。

    • 実際には、次の画面に進んでいる。しかし、処理中の画面を隠していないため、処理中のままのように見える。

    Jitta@わんくま同盟

    • 回答の候補に設定 佐伯玲 2013年1月23日 1:00
    • 回答としてマーク 佐伯玲 2013年1月24日 1:23
    2013年1月18日 0:49

すべての返信

  • 外池と申します。小生の経験に基づく説明で恐縮ですが、参考になれば幸いです。

    DataReceivedイベントは、ポートからの読み取りを試みるキッカケとして使うべきであって、プログラムの動作全体を制御するものとしてはアテにするべきでないと思います。DataReceivedイベントの発生する条件は、ドキュメントを見ても「OS次第」ということが書いてあって、ポートを通じてやりとりされる通信のプロトコルを反映したものにはならないと考えるべきです。

    「1行読み取れたら次へ」とか、「何文字読み取れたら次へ」というように、読み取ったデータがプロトコルに照らして一通り揃ったことをもって次へ進むように、プログラムすると確実だと思います。

    • 回答の候補に設定 佐伯玲 2013年1月23日 1:01
    • 回答としてマーク 佐伯玲 2013年1月24日 1:23
    2013年1月17日 0:41
  • VisualBasic2010のSerialPort.DataReceivedイベントを使用してデータ受信をし、変数に受信内容を格納するプログラムを作成しました。

    ここまでは問題ないのですが,変数に受信内容を格納した後に次画面に遷移させたいのですが、次画面に遷移させたときにアプリケーションの動作が処理中の状態のまま変わりません。

    何が問題なのかよろしくご教授お願いいたします。

     この後ろにコードがありますが、まず、

    • どのようなことを
    • どのような順番で

    行えば、目的が達せられると考えましたか?プログラミングの肝はこれなので、これが間違えていれば、「期待している動作」とはなりません。まず、手順が間違えているのか、それともコードが間違えているのか、そこの切り分けからはじめませんか?

     また、「アプリケーションの動作が処理中の状態のまま変わりません」を、もっと詳しく説明してください。今の状態ですと、次のようなことが考えられます。

    • 実際には、次の画面に進んでいる。しかし、処理中の画面を隠していないため、処理中のままのように見える。

    Jitta@わんくま同盟

    • 回答の候補に設定 佐伯玲 2013年1月23日 1:00
    • 回答としてマーク 佐伯玲 2013年1月24日 1:23
    2013年1月18日 0:49
  • こんにちは、JJ-unicorn さん
    フォーラムオペレータの佐伯 玲 です。

    その後寄せられた情報はご確認いただけましたでしょうか?
    参考になる情報だと思われたので勝手ながら私のほうで「回答としてマーク」とさせて頂きました。

    回答マークは後から解除することも可能ですのでご確認いただきうまくいかなかったりした際には状況のご返信とあわせてご活用下さい。

    宜しくお願いいたします。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2013年1月24日 1:23