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 ClassQRコードの受信に関しては前回のエントリーで紹介した内容に不具合があった為修正しています。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)
このサンプルを使って役に立った、又ここが違う等
感想、意見、ご指摘があればコメントいただけると嬉しいです。