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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

16353閲覧

VB.netのserialport通信での判定について

yukenai

総合スコア16

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/12/06 11:58

###したいこと#######################################################
VB.netのserialport(com)通信を使って、マイコンと通信し、マイコンからの受信データをIF文を使って、判定したいと思っています。

###発生している問題##################################################
受信データが最初の一文字目とその後の文字が途切れ途切れで受信しているため、if文でうまく判定できません。不一致ばかり(elseのみ) ちなみに一文字であれば、判定できます(then)。

###教えてほしいこと##################################################
途切れ途切れに受信しているデータを10文字程度一つの変数に格納できて、If文で判定できるソースコードを教えてください。
また、serialport1.ReadLine()の受信方法もあるようですが、簡単であれば、そちらの
ソースコードも教えて頂ければと思います。(初心者のため、受信部分を全文お願いします)
以上、よろしくお願いします。

###該当のソースコード#################################################

'****** 受信********************************************
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
'シリアルポートをオープンしていない場合、処理を行わない.
If SerialPort1.IsOpen = False Then
Return
End If
'エラー処理
Try
SetText(SerialPort1.ReadExisting())
Catch ex As Exception
btnClose_Click(Me, e)
End Try
End Sub

Private Sub SetText(ByVal [text] As String) If txtDataReceived.InvokeRequired Then Dim d As New SetTextCallback(AddressOf SetText) Invoke(d, New Object() {[text]})

'追加した判定文 受信データにより、TextBox1の背景色を変える!
'一文字の判定では、問題ないが、二文字以上になると一致しない
If text = "abcdefghjj" Then
TextBox1.BackColor = Color.Blue
Else
TextBox1.BackColor = Color.Red
End If

Else txtDataReceived.AppendText(text) End If End Sub

###試したこと#########################################################
初心者でよくわからず、あまり試していません(途方にくれている)

###補足情報(言語/FW/ツール等のバージョンなど)
ツールはVisual Stasio 2017 の VB.netにネットで見つけた通信ソフトを張り付けて、
検討してみました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

受信処理は体感されている通り、DataReceivedイベントが発生した時点で全てのデータを受信しているとは限りません。
ですので、受信したデータの判定を行う場合、通信仕様上データの受信が完了した時点で行うべきです。
今回の場合、その仕様が提示されていませんので、どのような状態が電文の受信完了となるかが不明です。
まずは、その通信仕様を理解しましょう。
(例えば、1つの電文は[CR][LF]で終了するとか、[STX]データ文字[ETX]と開始が[STX]で終了が[ETX]になるとか)
そうすれば、1つの電文の受信が終了したことを判定できるはずです。

大まかな流れは下記のようになるかと思います。

VB.NET

1'受信バッファ 2Private RecvBuffer As String = "" 3 4Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 5 'シリアルポートをオープンしていない場合、処理を行わない. 6 If SerialPort1.IsOpen = False Then 7 Return 8 End If 9 10 Try 11 '受信バッファに受信データを追加する 12 RecvBuffer &= SerialPort1.ReadExisting() 13 14 If 受信完了? Then 15 Dim Command As String 16 17 '次の電文を続けて受信している可能性があるなら 18 'ここでRecvBufferから1電文を取得する 19 Command = RecvBuffer 20 21 '受信バッファ解析後、あまりがあるならそのあまりの部分を残しておく。 22 'あまりがないなら受信バッファをクリアする 23 RecvBuffer = "" 24 25 '解析処理を行う 26 SetText(command) 27 End If 28 29 Catch ex As Exception 30 btnClose_Click(Me, e) 31 End Try 32End Sub

投稿2017/12/06 22:43

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukenai

2017/12/06 23:31

回答ありがとうございます。回答頂いた中で以下不明点があります。 ①電文の終了を[CR][LF]にしたいのですが、If 受信完了? Thenの受信完了?とはこの場合、電文の最後に[CR][LF]が入っているか確認するという意味でいいのですよね?また、受信完了?の部分の記述はどのようにするのでしょうか? ②解析処理とはIF文で電文の中身を確認するといういみですよね? ③SetText(command)の意味は? ④ちなみに、電文をTextBoxに表示させる記述はどのようにしたら、いいのでしょうか? 以上を教えて頂きたく、よろしく御願いします。
YAmaGNZ

2017/12/07 01:38

提示した部分は、DataReceivedイベントの部分のみで、その他はyukenaiさんが提示したソースを使うという形で書いてあります。 ①電文の終了が[CR][LF]でしたら  If RecvBuffer.Contains(vbCrLf) Then という感じで[CR][LF]が含まれるかチェックすればよいかと思います。  その後、[CR][LF]で分割し、その結果を解析すればよいかと思います。 ②~④はご自身が書かれているSetTextでの処理です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問