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

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

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

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

6698閲覧

VisualBasic でのシリアル受信割り込みについて

kakappa_kappa

総合スコア13

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/01/16 06:50

前提・実現したいこと

初歩的なことかもしれませんが、シリアル通信で”S”を受け取って数字のカウンティングを開始し、”P”を受け取ったタイミングで終了したいと思っています。

発生している問題・エラーメッセージ

発生している問題としては、”P”を受信しても止まらないことです。

該当のソースコード

vb

1Public Class Form1 2 Private receive As String 3 Private f As Boolean 4 5 Private Sub FormLoad(sender As Object, e As EventArgs) Handles MyBase.Load 6 With SerialPort1 7 'シリアルポートの設定 8 .PortName = "COM3" 'ポート名 9 .BaudRate = 9600 '通信速度指定 10 .Parity = IO.Ports.Parity.None 'パリティ指定 11 .DataBits = 8 'ビット数指定 12 .StopBits = IO.Ports.StopBits.One 'ストップビット指定 13 'シリアルポートのオープン 14 .Open() 15 End With 16 f = True 17 End Sub 18 'シリアルポート受信イベント 19 Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 20 'データ受信 21 Console.WriteLine("受信") 22 Dim arrByte As Byte() = New Byte(SerialPort1.BytesToRead - 1) {} '受信バッファー内のデータのバイト数分 23 'SerialPort の入力バッファーからバイト数を読み取り 24 SerialPort1.Read(arrByte, 0, arrByte.GetLength(0)) 25 'デリゲート生成 26 Dim dlg As New DisplayTextDelegate(AddressOf Check) 27 '受信バイト配列を文字列変換 28 receive = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(arrByte) 29 'デリゲート関数をコールする 30 Me.Invoke(dlg, New Object()) 31 End Sub 32 33 Delegate Sub DisplayTextDelegate(ByVal strDisp As Object) 34 35 Private Sub Check() 36 Console.WriteLine("受信:" & receive) 37 Select Case receive 38 Case "S" 39 Counting() 40 41 Case "P" 42 f = False 43 End Select 44 End Sub 45 Private Sub Counting() 46 Dim n As Integer = 0 47 48 While n < 10000 49 If f = True Then 50 Threading.Thread.Sleep(1000) 51 n = n + 1 52 Console.WriteLine(n) 53 Else 54 Exit Sub 55 End If 56 End While 57 End Sub 58End Class

試したこと

受信した文字を表示して試したところ”S”を受信した後は何も受け取っておらず、止めることができないでいるようです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Countingをコールして戻ってこないだけではないでしょうか
Invokeはデリゲートでの処理が終了するまで戻ってきません。
ですので、DataReceivedイベントハンドラから抜けずに次の受信ができない状態だと思います。
BeginInvokeを使用すれば、処理が完了しなくても戻ってきますので次の受信ができるかもしれませんが、結局UIスレッドでCounting関数が動作しますので、画面の操作は行えない状態となります。

投稿2019/01/16 07:50

YAmaGNZ

総合スコア10222

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

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

kakappa_kappa

2019/01/17 01:58

回答ありがとうございます。とりあえずはBeginInvokeで試してみようと思います。また何かありましたら、質問を投稿させていただきますので、そのときはよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問