投稿者 hori  (社会人) 投稿日時 2015/4/14 14:11:22
昨日の、shu さまの助言を得て試してみました。

Byte 型の変数を配列にして

dt(n) = port.ReadByte

とやるとエラーになってしまい、その解決方法が分からなかったので
どうせ使う文字は数字とSTXとETXだけなので
アスキーの文字コード表から拾って下記のようにやってみました。

=============

        Dim returnStr As String = ""

        Dim port As SerialPort = New SerialPort("COM3", 9600, Parity.Even, 7, StopBits.One)

        port.Open()

        port.DtrEnable = True
        port.RtsEnable = True

        port.ReadTimeout = 10000

        Dim STX As Integer = 2
        Dim ETX As Integer = 3

        Dim dt0 As Integer = 48
        Dim dt1 As Integer = 49
        Dim dt2 As Integer = 50
        Dim dt3 As Integer = 51
        Dim dt4 As Integer = 52
        Dim dt5 As Integer = 53
        Dim dt6 As Integer = 54
        Dim dt7 As Integer = 55
        Dim dt8 As Integer = 56
        Dim dt9 As Integer = 57

        Try

            Do

                If port.ReadByte = STX Then

                    'MsgBox("STX")

                ElseIf port.ReadByte = ETX Then

                    'MsgBox("ETX")

                    Exit Do
                Else

                    'MsgBox("dt")

                    Select Case port.ReadByte

                        Case dt0
                            returnStr &= "0"
                        Case dt1
                            returnStr &= "1"
                        Case dt2
                            returnStr &= "2"
                        Case dt3
                            returnStr &= "3"
                        Case dt4
                            returnStr &= "4"
                        Case dt5
                            returnStr &= "5"
                        Case dt6
                            returnStr &= "6"
                        Case dt7
                            returnStr &= "7"
                        Case dt8
                            returnStr &= "8"
                        Case dt9
                            returnStr &= "9"
                        Case Else
                            returnStr &= "?"
                    End Select

                    'MsgBox(returnStr)

                End If
            Loop

        Catch ex As TimeoutException

            returnStr &= "Error"

        End Try

        MsgBox(returnStr)

        port.Close()

        port.Dispose()

================

[ ' ]のついている行は実験および動作確認のためです。

これでやると、ちゃんと [STX] は確認できますが
[ETX]に至らず途中でタイムアウトになり
本来21ケタの数列であるはずのデータが[ ? ]の混じった10ケタの文字列になります。

Do ループの中の Select Case を止めてやると [ETX] まで至ります。

それで、[STX] を確認した時点で、ReadExisting を入れてみました。

=================

        Dim returnStr As String = ""
        Dim port As SerialPort = New SerialPort("COM3", 9600, Parity.Even, 7, StopBits.One)
        port.Open()
        port.DtrEnable = True
        port.RtsEnable = True
        port.ReadTimeout = 10000

        Dim STX As Integer = 2
        Dim ETX As Integer = 3

        Try

            Do

                If port.ReadByte = STX Then

                    'MsgBox("STX")

                    System.Threading.Thread.Sleep(1000)

                    returnStr = port.ReadExisting

                    MsgBox(returnStr)

                ElseIf port.ReadByte = ETX Then

                    MsgBox("ETX")

                    Exit Do
                Else

                End If
            Loop

        Catch ex As TimeoutException

            returnStr &= "Error"

        End Try

        MsgBox(returnStr)

        port.Close()

        port.Dispose()

================

この実験時に、[STX] 確認のために Msgbox を表示させたのですが
その [OK] ボタンを押すタイミングで表示されるデータの量が変わることに気付きました。

そこで、Msgbox の代わりに 

System.Threading.Thread.Sleep(1000)

を入れてみると、とりあえず期待するデータを得られるようになりました。

とはいえ、[ETX] に至らずタイムアウトして終わりますが・・・・・

なんとなく、首のところがイガイガした感じですが「まぁ、いいか」って感じです。