2005/12/17

RS232Cサンプル


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 件のコメント:

コメントを投稿