tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB シリアルポートは自動Closeできません。
記事No11293
投稿日: 2014/07/16(Wed) 11:41
投稿者KouTou
 初めまして。KouTouと申します。
 VB2010を利用して、シリアルポート受信のプログラムを作成しております。
 ある条件を満たしたら、ポートを自動的にCloseする、もしくは受信イベントを停止する、との設計仕様ですが、プログラムはなかなかうまく行けませんでした。
 因みに、FormにCloseボタンを置いて、それをクリックすると、いつでもCloseできます。
 例文は以下です。

Private Sub CloseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton.Click
    If SerialPort1.IsOpen = True Then
        'シリアルポートをクローズする.
        SerialPort1.Close()
    End If
End Sub

'****************************************************************************'
'データ受信が発生したときのイベント処理.
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
        '受信データを読み込む.
        Dim lenBuf
        Dim buf(1024) As Byte

        lenBuf = SerialPort1.Read(buf, 0, 1024)

        '受信したデータをテキストボックスに書き込む.
        Dim args(0) As Object
        args(0) = Encoding.GetEncoding("Shift_JIS").GetString(buf, 0, lenBuf)
        Invoke( New Delegate_RcvDataToTextBox( AddressOf Me.RcvDataToTextBox ), args )
    Catch ex As Exception
        MsgBox( ex.Message )
    End Try
End Sub

'****************************************************************************'
'受信データをテキストボックスに書き込む.
Private Sub RcvDataToTextBox( data As String )
    iRow = iRow + 1

    '受信データをテキストボックスの最後に追記する.
    If IsNothing( data ) = False Then
        RcvTextBox.AppendText(iRow.ToString() & " " & data)
    End If

    ''例えば、10回受信処理したら、受信処理を止める、もしくは、ポートをクローズする。
    ***If iRow >= 10 Then
    ***    SerialPort1.Close()
    ***End If

End Sub

 どなたかご教授して頂けませんでしょうか。

[ツリー表示へ]
タイトルRe: VB シリアルポートは自動Closeできません。
記事No11294
投稿日: 2014/07/16(Wed) 15:25
投稿者オショウ
>  どなたかご教授して頂けませんでしょうか。

  受信バッファに受信した分だけ読み出すようにすれば
  いつでもクローズできます。

  原因は、
  lenBuf = SerialPort1.Read(buf, 0, 1024)
  です。

  尚、非同期受信方式を採用するなら・・・

    If e.EventType = SerialData.Chars Then
    ' ここに受信部を書く  
    End If

  として、不必要なDataReceivedイベントで、動作しない
  ようにする必要があります。

  あと、DataReceivedイベントの先頭に
   If SerialPort1.IsOpen = False Then
        Return
    End If
  このコードがありますが、ポートがクローズされていると
  DataReceivedイベントは発生しないので、不必要かと。

※ 受信データにデリミタがあれば、そのコードまで読み込むように
  受信機能を書けば、CPU負荷は減り、動作も軽量化します。
  ReadTo を調べてみて下さい。

以上。

[ツリー表示へ]
タイトルRe^2: VB シリアルポートは自動Closeできません。
記事No11295
投稿日: 2014/07/16(Wed) 17:14
投稿者KouTou
オショウさん、ご返事ありがとうございました。

下記のURIを参考し、
h http://d.hatena.ne.jp/kamiyan2/20090928

Invoke()メソッド ⇒ BeginInvoke()メソッド に変更することで、クローズできない現象が解決できました。

なお、ご指摘された内容を参考になります。

今後ともご指導のほどよろしくお願いします。

[ツリー表示へ]