VB2005 シリアルポート 受信イベントについて


ko  2007-07-04 12:21:49  No: 136909

vb2005で、SerialPortコントロールを使わずにSystem.Io.Ports.SerialPortを使用して、独自通信クラスを作成しています。受信イベントを発生させる事が出来ずに困っています(SerialPortコントロールをFormで使用すれば受信イベントは発生しました)。どなたか、クラスでのDataReceivedイベントの実装方法と使用方法を教えていただけないでしょうか?

Imports System.IO.Ports

Public Class Class1

  Public Event DataReceived As SerialDataReceivedEventHandler
  Private srcomm As SerialPort
  Private handler As SerialDataReceivedEventHandler

  Public Sub New() 
        srcomm = New SerialPort
        AddHandler srcomm.DataReceived, handler
  End Sub

  Private Sub srcomm_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Me.DataReceived
  End sub
  
  End Class

  上記のようにやってみましたが、受信イベントは発生しませんでした。


オショウ  2007-07-04 17:39:16  No: 136910

書かれているソースコードはあくまで流れを表している
と思っていますが、ポートオープンの際に1点忘れてい
る設定があろうかと。

srcomm.ReceivedBytesThreshold = 1

を入れれば、受信イベントは発生するかと。

他にも通信相手によっては、制御ラインの設定等があり
ますが、それらは問題ないのでしょう。

※  Public Event DataReceived  を宣言しなくても、
    AddHandler srcomm.DataReceived, AddressOf DataReceived
    としても問題ないはずです。

以上。


ko  2007-07-04 21:50:20  No: 136911

オショウさん、ありがとうございます。早速  srcomm.ReceivedBytesThreshold = 1
を下記のように追加してみましたが、イベントは発生せずでした。
 Private Sub connectionSettings(ByVal strNo As String)
        With srcomm
            .PortName = strNo  "COM1
            .BaudRate = 9600
            .DataBits = 8
            .Parity = Parity.Even
            .StopBits = StopBits.One
            .ReceivedBytesThreshold = 1
        End With
 End Sub
  
  で、SerialPortのインスタンス生成をやめForm上でSerialPortコントロールを使用すると、受信イベントは発生しました。


魔界の仮面弁士  2007-07-04 22:29:21  No: 136912

>  Public Event DataReceived As SerialDataReceivedEventHandler
これは、イベントを受け取るための宣言ではなく、
独自定義のイベントを追加するための宣言です。今回は不要でしょう。

イベントを受け取りたいなら、下記のような感じになるかと。

====== [WithEvents] と、[Handles] を使った指定方法 ======

Public Class Class1
    Private WithEvents srcomm As New SerialPort()
    Private Sub srcomm_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles srcomm.DataReceived

    End Sub
End Class


====== [AddHandler] を使った指定方法 ======

Public Class Class1
    Private srcomm As New SerialPort()
    Public Sub New()
        AddHandler srcomm.DataReceived, AddressOf srcomm_DataReceived
    End Sub
    Private Sub srcomm_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)

    End Sub
End Class


> SerialPortコントロールを使用すると
System.IO.Ports.SerialPort クラスは、
コントロール (System.Windows.Forms.Control)ではなく、
コンポーネント (System.ComponentModel.Component)です。


ko  2007-07-04 23:07:01  No: 136913

魔界の仮面弁士さん、オショウさん有難うございます。WithEventsステートメントを使用して、受信イベントが発生しました。本当に有難うございます。イベントとイベントハンドラーを関連付けさせるのには、WinthEventsとAddHandlerの二つがあるみたいですね。ただ、上記のAddHandlerを使用すると、コンパイルエラーになってしまいました。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加