none
シリアルポート通信 複数行のデータを受信したときの処理方法が分からない RRS feed

  • 質問

  • 初心者の黒です。

    win10でVS2015professionalでアプリ開発しています。

    パソコンとデータロガーという機械をRS232C+USBケーブルでつなげて通信するアプリを作っています。

    ポートを開いて、パソコン側からデータ送信の命令を出して、受信するところまではできました。

    しかし、ロガーから出力されるデータが複数行の為、テキストボックスに出力された時に一番最後のENDという文字しか表示できません。

    どうしたら、テキストボックスに複数行を表示させられますか?もしくは出力文の途中を抜き出せますか?

    *************************************************************************************

    シリアル通信部分のプログラム

    '**************************************************************
        '*
        '*       計測ボタンを押す
        '*
        '**************************************************************
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim str As String
            str = "ST" + vbCrLf
            If SerialPort1.IsOpen Then
                SerialPort1.Write(str)
            End If

        End Sub



        '**************************************************************
        '*
        '*       データ受信が発生した時の処理
        '*
        '**************************************************************

        Private Sub SerialPort1_DataReceived(sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

            'シリアルポートをオープンしていない場合、処理を行わない
            If SerialPort1.IsOpen = False Then
                Return
            End If

            Try
                '受信データを読み込む

                data = SerialPort1.ReadLine()

                '受信したデータをテキストボックスに書き込む
                Dim args(0) As Object
                args(0) = data
                Invoke(New delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args)

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try


        End Sub

        '**************************************************************
        '*
        '*       受信データをテキストボックスに書き込む
        '*
        '**************************************************************

        Private Sub RcvDataToTextBox(ByVal data As String)

            Dim parts As String()
            Dim Count As Integer
            Dim x As Integer

            If IsNothing(data) = False Then
                TextBox1.Text = data
                'parts = Split(data)
            End If
        End Sub


    下の図はテラターンで通信した画面

    アプリで受信した画面、テキストボックスは一応マルチラインになってます。

    2019年3月29日 1:11

回答

  • 上の書き方はC#の書き方でした。
    VBだと"TextBox1.AppendText(data & vbNewLine)とかでしょうか。

    かならず"END"の時だけ改行を付加するのであれば、
    dataの中身をチェックして付加するかどうかの判定を行えばよいです。
    多分こんなんで動くと思います。
    TextBox1.AppendText(data)
    If data = "END" Then
    	TextBox1.AppendText(vbNewLine)
    End If



    • 回答としてマーク 9638masa 2019年3月29日 8:42
    2019年3月29日 2:20

すべての返信

  • TextBox1.Text = data
    では、Textの値を上書きしてしまいます。
    そのため、最終行の値が表示されます。

    TextBox1.AppendText(data + "\n")
    とすれば、上書きではなく追加されると思います。

    https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.textboxbase.appendtext?view=netframework-4.7.2

    2019年3月29日 1:28
  • uemu様

    お世話になります。

    ありがとうございました。できました。

    こんなことができるんですね~。「¥n」を「,」に変更すれば、CSVですね。

    助かりました。

    贅沢を言うと、ENDの後だけCRLFで改行できると最高なんですが、ないですかね~。

    2019年3月29日 2:01
  • 上の書き方はC#の書き方でした。
    VBだと"TextBox1.AppendText(data & vbNewLine)とかでしょうか。

    かならず"END"の時だけ改行を付加するのであれば、
    dataの中身をチェックして付加するかどうかの判定を行えばよいです。
    多分こんなんで動くと思います。
    TextBox1.AppendText(data)
    If data = "END" Then
    	TextBox1.AppendText(vbNewLine)
    End If



    • 回答としてマーク 9638masa 2019年3月29日 8:42
    2019年3月29日 2:20
  • uemu様

    できました。ありがとうございました。

    ENDのあとに空白があって上手くできませんでしたが、

    先頭三文字が”END”の時という条件にしたらできました。ありがとうございました。

     '**************************************************************
        '*
        '*       受信データをテキストボックスに書き込む
        '*
        '**************************************************************

        Private Sub RcvDataToTextBox(ByVal data As String)

            Dim kakunin As String = data.Substring(0, 3)


            If kakunin = "END" Then
                TextBox1.AppendText(vbNewLine)

            Else
                TextBox1.AppendText(data + ",")
            End If



        End Sub

    2019年3月29日 8:42