2014.3.29追記
※旧ロリポブログ サービス終了に伴い転載しました。
※内容が古く、間違いを多く含んでいる可能性があります。
本記事は.NET FrameWork1.1限定となります
.NET FrameWork2.0以降では SerialPortクラスを使います。
http://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport(v=vs.110).aspx
以前のエントリー RS232Cポートを扱う では説明不足や不具合もあり
役に立たないと思われるので改めてサンプルを紹介します。
(今回はプロジェクトがダウンロードできるようにしました)
サンプルソフトの動作は、
1.スキャナでQRコードを読み取り
↓
2.配置されたテキストボックスへ読み取りデータを表示
↓
3.リレー出力ユニットで接点No1を0.2秒間だけONさせる
といった形になっていて、ハード構成はQRコードの読み取りに GT10Q-SU 、リレー出力にはPHC-100を使用しています。尚、前者はCOM3、後者はCOM1に接続されているものとします。
また、サンプルとして読み取るQRコードは、”1234567”とだけ書かれた物を利用します。
QRコードのbmpはプロジェクトに収めてありますので
解像度の高いプリンタで印刷してから利用してください。
ポートの制御は以前紹介したとおり
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=7a677255-dd17-4105-9801-949243916763
Serial comunication (RS232) using VB.Net
の中にあるCRs232.vbを改造して利用しておりますが、改造内容の説明は省略させて頂きます。
QRコードのデータ受信にはそのままRS232クラスを使っており、アプリケーションロード時に、以下の様にして受信待機させる。
Private PATLITE As New cPatLite
Private WithEvents RS232c As New Rs232
Private Sub fmRS232sample_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
With RS232c
.Port = 3
.Timeout = 5000
.BaudRate = 9600
.WorkingMode = Rs232.Mode.Overlapped
If Not .IsOpen Then
.Open()
End If
.AsyncRead(1)
End With
End Sub
信号の出力にはRS232クラスにもう一つかぶせたcPatLiteクラスを作成して制御しています(自部署では、あるドアのロックを解除する為、に利用してるので、DoorOpen()というメソッド名になってます)パトライトクラス
Public Class cPatLite
Private myRs232 As New Rs232
Private bThStarted As Boolean = False
Public Sub New()
With myRs232
.Port = 1
.BaudRate = 9600
.DataBit = 8
.Timeout = 5000
.Parity = Rs232.DataParity.Parity_None
.StopBit = Rs232.DataStopBit.StopBit_1
.WorkingMode = Rs232.Mode.NonOverlapped
End With
End Sub
Public Sub DoorOpen()
Dim Th As New System.Threading.Thread( _
AddressOf Me.OpenOplate)
If bThStarted Then Return
Th.Start()
End Sub
Private Sub OpenOplate()
bThStarted = True
With myRs232
.Open()
.Dtr = True
.Rts = True
.Write("@??101!")
System.Threading.Thread.Sleep(200)
.Write("@??001!")
.Close()
End With
bThStarted = False
End Sub
Public Sub ALL_Reset()
With myRs232
.Open()
.Dtr = True
.Rts = True
.Write("@??0??!")
.Close()
End With
End Sub
End Class
QRコードの受信に関しては前回のエントリーで紹介した内容に不具合があった為修正しています。RS232クラスは別スレッドで受信待機し、受信があったらイベントを発生させるのですが、UIスレッドとは異なる為イベントハンドラの処理内容によっては想定外の動作をする事があります。その為、UIスレッドへマーシャリングする処理を追加しました。
'デリゲート宣言
Private Delegate Sub ReceivedDEL(ByVal Source As Rs232, _
ByVal Databuffer() As Byte)
Private Sub Received(ByVal Source As Rs232, _
ByVal DataBuffer() As Byte) Handles RS232c.DataReceived
If Me.InvokeRequired Then
Dim d As New ReceivedDEL(AddressOf Received)
Me.Invoke(d, New Object() {Nothing, Nothing})
Else
Dim retStr As String = RS232c.InputStreamString
TextBox1.Text = retStr
'QRコードから読み取ったデータは末尾に改行コードがあるので削除
retStr = retStr.Remove(retStr.Length - 1, 1)
If retStr = "1234567" Then
'ドア開閉処理
PATLITE.DoorOpen()
End If
End If
End Sub
アプリケーション終了時は受信待機してるスレッドを停止させます
Private Sub fmRS232sample_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
RS232c.ThreadExit()
RS232c.Close()
End Sub
■このサンプルを利用したことで発生したいかなる損害も当方は一切責任を負わないものとしますので、了承した上でダウンロードしてください。(2005.10.23)
・ダウンロード RS232sample.zip (299KB)
このサンプルを使って役に立った、又ここが違う等
感想、意見、ご指摘があればコメントいただけると嬉しいです。
0 件のコメント:
コメントを投稿