Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
シリアルポート通信
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=21786#CommentId58964
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
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] に至らずタイムアウトして終わりますが・・・・・
なんとなく、首のところがイガイガした感じですが「まぁ、いいか」って感じです。