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
上記のようにやってみましたが、受信イベントは発生しませんでした。
書かれているソースコードはあくまで流れを表している
と思っていますが、ポートオープンの際に1点忘れてい
る設定があろうかと。
srcomm.ReceivedBytesThreshold = 1
を入れれば、受信イベントは発生するかと。
他にも通信相手によっては、制御ラインの設定等があり
ますが、それらは問題ないのでしょう。
※ Public Event DataReceived を宣言しなくても、
AddHandler srcomm.DataReceived, AddressOf DataReceived
としても問題ないはずです。
以上。
オショウさん、ありがとうございます。早速 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コントロールを使用すると、受信イベントは発生しました。
> 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)です。
魔界の仮面弁士さん、オショウさん有難うございます。WithEventsステートメントを使用して、受信イベントが発生しました。本当に有難うございます。イベントとイベントハンドラーを関連付けさせるのには、WinthEventsとAddHandlerの二つがあるみたいですね。ただ、上記のAddHandlerを使用すると、コンパイルエラーになってしまいました。
| ツイート |
|