'
' (C)Copyright by Techno Veins Co.,Ltd.
' All right reserved. 2008
'
'
' このプログラムの著作権はテクノベインズが保有します。
' 独自開発プログラムへソースの組込使用については自由に参考利用していただいてかまいません。(費用・登録等不要。)
' VFD2002E販売の際、商品に添付して配布することはご自由に行ってください。
'
' 直接ソースの全部または一部を販売することは禁止します。
' ソースの全部または一部を再配布や書籍・Web等への許可なき転載は禁止します。
'
' 本プログラムは参考用であり、すべてのお客様の環境で動作を保証するものではありません。
' また、本プログラムを用いることで、何らかの不利益が発生した場合であっても、テクノベインズでは一切の保証を行いません。
'
' 説明のために1行で記述できる行も分解して記述している部分があります。
'
'
' 変更履歴
' Jan.21.2008 Ver 0.01 Naoya Takaku
'
Public Class frmSampleVFD2002E
'
' VFD2002E用
' 簡単な表示およびシリアル制御のサンプル
'
'
' VFD2002Eのコマンドについてはhttp://www.technoveins.co.jp/pdf/vfd2002e_manual.pdf
' を参照のこと
'
' Serial Portコントロールプロパティにてボーレート等の通信条件を設定してある。
' 通信にハンドシェークを用いるため、必ずタイムアウトを設定し、デッドロックを防止すること
' TextBox1はCOMポートの初期番号をiniComPortに自動保存している
Dim MsgCount As Integer = 0
'
' フォームロード処理 初期条件等を設定
'
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim CheckPort As Boolean = False
'My.Settingsに保存されている初期値を取得する。この後、ループ内で使用するために一旦Stringに入れている。
'Tips: DIM宣言の代入の際に、Stringのメソッドを用い、合わせて文字の大文字化と前後空白削除を順に実行している
Dim prevComPort As String = My.Settings.iniComPort.Trim.ToUpper ' 保存されている通信ポート名
' For Each文で、実行時に登録されている全てのComポート名を取得する。
' VB2005で追加されたMyを使用して、SerialPort名一覧を取得
For Each portName As String In My.Computer.Ports.SerialPortNames
' 見つかったCOMポート名称のComboBox1への登録
ComboBox1.Items.Add(portName)
' ポート名が保存されており、最終保存名と同じポートが存在するか?
' Tips: andalsoは条件不成立後は以降の式の評価を行わない。
If prevComPort.Length > 0 AndAlso portName = prevComPort Then CheckPort = True
Next
' 登録されているポート名は現在有効である。
If CheckPort Then
' 保存されているポート名を使用する
SerialPort1.PortName = prevComPort
ComboBox1.Text = prevComPort
Else
' ポート名が確定していない場合、最初のポートを初期ポートとする
' Tips:ComboBox1のプログラムからの選択は.SelectedIndexで行い、先頭のインデックスは0
If ComboBox1.Items.Count > 0 Then ComboBox1.SelectedIndex = 0
End If
' シリアルポート送信データの文字エンコードを指定する。(VB2005!!)
SerialPort1.Encoding = System.Text.Encoding.GetEncoding(932) ' SJIS
End Sub
'
' VFD2002Eへのシリアル送信
'
Private Sub SendVfd(ByVal mesTxtUpper As String, ByVal mesTxtLower As String)
SendVfd(Chr(&HB) & radj(mesTxtUpper) & Chr(&HB) & Chr(&HA) & mesTxtLower)
End Sub
Function radj(ByVal mesTxt As String) As String
Return mesTxt.PadRight(20).Substring(0, 20)
End Function
'
' 通信条件はSerialPortコントロールのプロパティにて直接代入済み
'
Private Sub SendVfd(ByVal mesTxt As String)
Try
' この例では、シリアルポートの所有権を1回送信ごとに開放している。
' 高速な表示速度が要求される場合、プログラム実行中は常にシリアルポートをOPEN保持する方法もある。
' また、レシートプリンタへの出力で、紙切れエラーが送信から遅れて受信され、データ再送が必要な場合など、
' 複雑な動きが想定される場合、スレッドを利用してバックグラウンドジョブとして送信する方法もある。
' この例では、送信タイムアウトはコントロールプロパティにて設定している
SerialPort1.Open()
' 送信
' Tips:SerialPortで直接Encode処理ができるため、VB2003までのような独自の文字Encord処理は不要
SerialPort1.Write(mesTxt)
Catch ex As Exception
' 最小限のエラー処理しか行っていない。
' これだけでもケーブルが外れた場合などの際、タイムアウトのエラーで表示が行える。
MsgBox("シリアル通信エラー", MsgBoxStyle.Critical)
End Try
' 送信バッファが空になるのを待ってClose処理を行う
While SerialPort1.BytesToWrite > 0
' 必要に応じて、タイムアウト処理を組み込む(この例のままではForever戻ってきません。)
End While
' ポートのクローズ
SerialPort1.Close()
End Sub
'
' COMポートの指定が変更された
'
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ComboBox1.SelectedIndexChanged
Try
' SerialPortコントロールのPort値を変更する
SerialPort1.PortName = ComboBox1.Text
' ComboBox1.TextをMy.Settings.iniComPortにPropertyBindingで接続するか、変更があった場合手動で保存する
My.Settings.iniComPort = ComboBox1.Text
' Formが終了される際にもMy.Settingsは自動的に保存されるが、ここで強制的の保存する例
My.Settings.Save()
Catch ex As Exception
MsgBox("シリアルポート設定エラー", MsgBoxStyle.Critical)
End Try
End Sub
'
' デモボタン
'
' VFD2002Eハードウェア初期化
Private Sub btnHardwareInit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHardwareInit.Click
SendVfd(Chr(&H1B) & Chr(&H40))
End Sub
' CLEAR SCREEN(&H0c)
Private Sub btnCls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCls.Click
SendVfd(Chr(&HC)) ' 画面クリアコマンドのみ送信する
MsgCount = 0
End Sub
Private Sub btnUriage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUriage.Click
' 表示用ダミーカウント このボタンは、押すたびに異なるメッセージがサイクルする
' Tips VBでも+=が使えるようになりました。
MsgCount += 1
MsgCount = MsgCount Mod 3
' 画面原点移動(&HB)と文字表示(半角40文字 20桁2行分)
' 表示データをあらかじめ構成しておき、半角40文字として送信する
' 画面をクリアするよりも、表示原点をホームポジションに移動して画面全てを書き換えたほうが高速に表示できる
' ホームポジションを入れなくとも40文字出力により毎回同じ位置に表示するが、
' 通信エラーなど異常表示により表示がずれることを防ぐために、ホーム(&hB)を行っている
Select Case MsgCount
Case 0
SendVfd("トマトケチャップ \120", "ケイ: 3テン \12,345")
Case 1
SendVfd("キャベツ \100", "ケイ: 1テン \5,545")
Case Else
SendVfd("マグロブツ \1,500", "ケイ: 1テン \12,545")
End Select
End Sub
' 合計表示例
Private Sub btnAzukari_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAzukari.Click
SendVfd("ケイ 10テン \8,500", "オツリ: \1,500")
End Sub
'
' プログラム終了
'
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Application.Exit()
End Sub
End Class
|