シリアルポート[COMポート]に接続したカスタマディスプレイVFD2002Eに
メッセージを表示する
カスタマディスプレイVFD2002Eは
、PCPOSレジでお客様に商品名や商品単価、値引き、お買い上げ合計金額やつり銭などの情報を表示する小型のディスプレイです。
カスタマディスプレイとは、店舗のレジなどでよく見られる、商品名や金額、お釣りなどの情報を、お客様向けに表示するディスプレイです。
VFD2002Eは、青緑色の文字のVFD(蛍光表示管)を用い、パソコンのシリアルインターフェースに接続し、ANK(英数カナ)文字を20桁2行表示します。
英数カタカナ文字での表示により、レジ業務以外の用途でも、店頭、工場、病院、学校、待合所、景品交換所などで各種表示に用いることができます。
シリアルケーブルを用い、10メートル以上パソコンと離れた場所へのメッセージ表示を行うこともできます。
このページでは、プログラム言語としてVisual Studio2013(VB2013)やVisual Studio Express 2013 for Windows Desktopを用い、
シリアルポート(COMポート)に接続したVFD2002Eに
、メッセージを表示する基本的な
操作を、具体的なプログラム例とともに解説します。
VB2013のVBとは、Visual
Basicを表します。 VB2013はVS2013(Visual Studio)に含まれる言語です。
Visual Studioには、Visual Basicのほかに、Visual C#、 Visual C++など複数の言語が含まれます。
また、開発する内容により Visual Studio Professional 2013, Visual Studio Premium 2013,
Visual Studio Team Foundation Server 2013, Visual Studio Ultimate
2013などいくつかのレベルがあります。
この中で、制限はあるものの無償で利用できる、Visual Studio Express版があります。
本章で取り扱うデスクトップ用プログラムを作成する場合、有償版のVisual Studioを用いるか、Visual Studio Express 2013
for Windows Desktopをマイクロソフト社のDownload Centerからダウンロードしてインストールしてください。
Visual Studio Express 2013 for Windows Desktopは、Windows 7 Service Pack
1, Windows 8, Windows 8.1, Windows Server 2008 R2 SP1, Windows Server 2012,
Windows Server 2012 R2での動作がサポートされています。
VB2008をご利用される場合は「VB2008からカスタマディスプレイVFD2002Eにメッセージを表示する」をご参照ください。
その他情報は、ページ最下段のインデックスをご参照ください。
Visual Studio 2013 Expressは無料で使用できるWindows用プログラムの開発環境です。
無償版というと、評価用プログラムや作成したソフトに制限や広告表示などがつくように思われますが、MicrosoftのWebページにも書かれているように、「Visual
Studio Express の商業目的の使用 Visual Studio Express
製品は、各製品のライセンス条項に従うことを条件として、無料で商用、製造用に使用できます。たとえば、Express for Windows
を使用してアプリを作成し、販売用に Windows
ストアに提出することができます。」とあるように、業務で利用するアプリやお客様用に作成するアプリの開発に利用することができます。
機能的な制限として、Express版ではコントロールオブジェクトを作成することはできません。
Visual Studio
2013 Express版(無料バージョン)をマイクロソフト社のDownload Centerからダウンロードする際、for Windows
Desktop版、 for Web版、 for Windows版の3種類のインストーラが存在します。
Visual Studio
2013(有料販売版)ではこれらはメニュー画面から選択できますが、Express版ではインストールするプログラム自体異なります。
-
for Windows
Desktop版はXP、Vista、7、8、8.1、Server2012など従来からのWindows上の.Netframeworkで動作する EXEやDLLなどを開発するためのツールです。本Webページの説明ではDesktop用アプリケーションを作成します。
-
for WebはMicrosoft社のWebサーバーであるIIS上で動作するWebアプリを作成します。
-
for Windows版は、Windows
8で登場したストアアプリ用の開発環境です。
注意事項として、for
Windows版において作成する、Windows8用のストアアプリとWindows8.1用のストアアプリは異なるもの(別物)と考えてください。
Windows 8用のストアアプリを開発するのであればVS2012を用います。 Windows 8.1用を開発する場合、VS2013を利用します。
Windows8からWindows8.1への無償アップデートにより、Windows8は大きくにシェアを失う(最初からなかったもの.... Vistaのように....)と考えられますので、新規開発ではVS2013をお勧めします。
シリアルポートについて
シリアルポートは、当初パソコンの標準通信ポートとして装備されてきました。25Pin
D-Subコネクタを用いたもので、のちに9PinD-Subコネクタを用いられました。
モデム接続やPC間の接続、周辺機器の接続といった多くの通信用途に使用されてきました。
現在のGigabitレベルの転送速度をターゲットとした近年のインターフェースから比べると、最高伝送速度が19200bps~115200bps程度であり、USB3.0の5Gbit(5000000000bps)と比べると
速度的にかなり低速です。
また、コネクタの物理的な大きさや、PC仕様(規格に準拠した)のRS232コネクタでは電源供給がないなどから、近年は標準通信インターフェースとしての役割をLANやUSBなどに譲って、ほとんどのPCからコネクタすらなくなってしまいました。
しかし、シリアルポートの利点はたくさんあり、多くの規格により標準化されており、また上記の近年のインターフェースと比べ原理が簡単であり、プログラムからの使い方も簡単です。
世の中のすべての用途が超高速な転送速度を必要としているわけではありませんので、ご自分で機器制御をされるのであれば通信の基本であるシリアルポートを利用する方法もあると思います。
今回は、このレガシーデバイスであるシリアルポートを利用しますが、いずれのPCでも利用できるように、USBポートに接続してシリアルポートを拡張するUSB232-00というアダプタを利用した開発例を示します。
USB232-00をWindows8.1に接続
USB232-00は、USBポートの接続しRS232シリアルポートを増設する拡張アダプタです。
Windows XP以降で利用でき、現在販売中であるUSB232-00のRev.G以降では、Windows
8/8.1へ対応した新しい通信チップへの対応を行っています。
今回は、OSにWindows8.1をインストールしたPCに、USB232-00を接続し、VFD2002Eをシリアルポート接続し機器制御した例を示します。
VFD2002EをUSBでご使用になる場合、USB232-00がバンドルされ、個別でご購入されるよりお得になったVFD2002E/USBをお勧めします。
プログラムの作成
Visual Studio Express 2013
for Windows Desktop(有償版のVisual Studioでも同じです)を起動し、ファイルメニューから新しいプロジェクトを開きます。
フォーム画面の説明
Windowsフォームのデザインです。
フォームタイプのプログラムを作成する場合、ベースとなるフォームの上に、画面左側に隠れているツールボックスからコントロールを選択して配置(マウスによるドラッグ&ドロップ)します。
上記では、Button(ボタンコントロール)やComboBox(コンボボックスコントロール)などを配置しています。
配置の際に、各コントロールの名称やプロパティを設定します。
本デモでは、フォームのボタンを押すことで、VFD2002Eのコマンドや固定メッセージを直接シリアルポートに送信することで表示のデモを行います。
上記画面中の下段にserPortと名前を付けたコンポーネントがありますが、これはSerialPortコンポーネントです。
コンポーネントは、コントロールのようにフォーム画面への表示はありませんが、フォームに張ることで、フォームととも(フォームを親コンテナとして)に機能します。
このコンポーネントを利用することで、シリアル通信を簡単に行うことができます。
※.NetFrameworkを用いた開発の場合、SerialPortコンポーネントを用いずともシリアル通信関数が準備されているため、簡単にシリアル通信を行うことはできます。
ワンポイントアドバイス
文字を取り扱う多くの業務系周辺機器は文字コードがJIS規格に準じたShift-JISを用いています。
Windowsで用いているUnicode文字列をそのままシリアルポートへ送信した場合、文字化けを起こします。
シリアル送信を行うSerialPortコントロールには、文字コードエンコードのプロパティ(.Encoding)があり、このプロパティに文字コードページを指定するだけで自動的に設定した文字エンコードにて送信されます。
プログラム実行フォーム
ボタンには固定メッセージを割り付けてあり、商品売り上げボタンについては、ボタンを押すごとにメッセージがいくつか表示できるようなサンプルとなっています。
サンプル実行でのVFD2002E表示例 半角かなメッセージを表示中
VB2013のSerialPortコントロールは、Win32APIで制御できなかったタイムアウト処理やVB2003では苦労したEncode処理などが使用できるため、
簡単にシリアルポートを利用できます。
本例はシリアル通信によりVFD2002Eが簡単に制御できることを示すために作成したもので、そのまま何かに利用できるわけではありませんが、VB2013の利用やVFD2002Eを
使ったプログラムを作成していただ
くきっかけにしていただければ幸いです。
VB2013用 VFD2002E表示のサンプルソース
以下のソース中ではVFD2002Eに表示するメッセージとして半角のカタカナ文字を使用しています。
インターネット通信の経路によっては、半角カタカナ(8bit Code)は化ける恐れがあります。
(このWebを配信しているWebサーバの基本エンコードがUTF-8エンコードであるため)
以下のVB2013用ソースコードはダウンロードソースと同じものですので、このWeb表示で文字化けが発生する場合はそちらをご覧ください。
Public Class frmDemoVfd2002
'
' (C)Copyright by Techno Veins Co.,Ltd.
' All right reserved. 2014
'
'
' このプログラムの著作権はテクノベインズが保有します。
' 直接ソースの全部または一部を販売することは禁止します。
' ソースの全部または一部を再配布や書籍・Web等への許可なき転載は禁止します。
'
' お客様が行う独自開発プログラムへソースの組込使用について、自由に参考利用していただいてかまいません。(費用・登録等不要。)
' VFD2002E販売の際、商品に添付して配布することはご自由に行ってください。
'
'
' 本プログラムは参考用であり、すべてのお客様の環境で動作を保証するものではありません。
' 特に、実用のプログラムに組み込む場合、さらなるエラー処理等を組み込んでください。
' また、本プログラムを用いることで、何らかの不利益が発生した場合であっても、テクノベインズでは一切の保証を行いません。
'
' 説明のために1行で記述できる行も分解して記述している部分があります。
'
'
' 変更履歴
'
' Apr.22.2014 Ver 1.00 Naoya Takaku : VB2014
'
Dim MsgCount As Integer = 0 '表示内容更新用カウンタ
'
' フォーム開始時の初期化処理
'
Private Sub frmDemoVfd2002_Shown(sender As Object, e As EventArgs) Handles Me.Shown
Dim CheckPort As Boolean = False
'My.Settingsに保存されている通信ポート名の初期値を取得する。ループで使用するために一旦Stringに入れている。
Dim prevComPort As String = My.Settings.iniComPort.Trim.ToUpper
' For Each文で、実行時に登録されている全てのComポート名を取得する。
' My.computerを使用して、SerialPort名一覧を取得
For Each portName As String In My.Computer.Ports.SerialPortNames
' 見つかったCOMポート名称のComboBox1への登録
cmbComPort.Items.Add(portName)
' ポート名が保存されており、最終保存名と同じポートが存在するか?
If prevComPort.Length > 0 AndAlso portName = prevComPort Then CheckPort = True
Next
' 全てのポートを取得後、登録されているポート名は現在でも有効であるか?
If CheckPort Then
' 有効であるため、保存されているポート名を使用する
serPort.PortName = prevComPort
cmbComPort.Text = prevComPort
Else
' ポート名が確定していない場合、最初のポートを初期ポートとする
' Tips:cmbComPortのプログラムからの選択は.SelectedIndexで行い、先頭のインデックスは0
If cmbComPort.Items.Count > 0 Then
cmbComPort.SelectedIndex = 0
Else
MsgBox("シリアルポートが見つかりません。", MsgBoxStyle.Critical)
End If
End If
' シリアルポート送信データの文字エンコードを指定する。
serPort.Encoding = System.Text.Encoding.GetEncoding(932) ' SJISエンコーディング
End Sub
'
' フォーム終了要求
'
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
Me.Close()
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
' この例では、シリアルポートのOpen制御を1回の送信ごとに開放している。
' Open処理は時間がかかるため、高速な表示速度が要求される場合、プログラム実行中は常にシリアルポートをOPEN保持する。
' また、レシートプリンタへの出力で、紙切れエラーが送信から遅れて受信され、データ再送が必要な場合など、
' 複雑な動きが想定される場合、スレッドを利用してバックグラウンドジョブとして送信する方法もある。
' シリアルポートOpenを継続した場合、同じポートに対してはOpenできないため注意を要する。
' この例では、送信タイムアウトはコントロールプロパティにて設定している
serPort.Open()
' 送信 serPort.EncodingプロパティによりSerialPortコントロール側でEncode処理する
serPort.Write(mesTxt)
Catch ex As Exception
' 最小限のエラー処理しか行っていない。
' これだけでもケーブルが外れた場合などの際、タイムアウトのエラーで表示が行える。
MsgBox("シリアル通信エラー", MsgBoxStyle.Critical)
End Try
' 送信バッファが空になるのを確認してClose処理を行う
While serPort.BytesToWrite > 0
' 必要に応じて、タイムアウト処理を組み込む(この例のままではForever戻ってきません。)
End While
' ポートのクローズ
serPort.Close()
End Sub
'
' COMポートの指定が変更された
'
Private Sub cmbComPort_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbComPort.SelectedIndexChanged
Try
' SerialPortコントロールのPort値を変更する
serPort.PortName = cmbComPort.Text
' ComboBox1.TextをMy.Settings.iniComPortにPropertyBindingで接続するか、変更があった場合手動で保存する
My.Settings.iniComPort = cmbComPort.Text
' Formが終了される際にもMy.Settingsは自動的に保存されるが、ここで強制的の保存する例
My.Settings.Save()
Catch ex As Exception
MsgBox("シリアルポート設定エラー", MsgBoxStyle.Critical)
End Try
End Sub
'
' デモボタン
'
' VFD2002Eハードウェア初期化
Private Sub btnInit_Click(sender As Object, e As EventArgs) Handles btnInit.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 btnDispUriage_Click(sender As Object, e As EventArgs) Handles btnDispUriage.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 btnDispAzukari_Click(sender As Object, e As EventArgs) Handles btnDispAzukari.Click
SendVfd("ケイ 10テン \8,500", "オツリ: \1,500")
End Sub
End Class |
上記例では、2通りのSendVfdで表示を行っています。
1つは、上下の文字列をそれぞれ別に与える方法で、もう1つは1行分
HOME+20桁2行(41Byte)を送信することで、簡単に画面更新が行えます。
いずれの場合も、表示開始前に先頭位置(左上)にカーソル(デフォルトでは非表示)ポジショニングを行ってから、全画面分の文字を出力することで、画面クリアを行っていません。
画面クリアすると瞬間的に画面が消えることで目にフリッカーとして残るために、画面クリアを行わずに表示を行ったほうが、見た目に美しく表示が行えます。
転送レート19200bpsでは、HOME制御や文字表示では通信ハンドシェークはほとんど発生しませんので、画面更新として41Byte送信するための通信時間である0.02秒程度で画面更新ができます。
上記のプロジェクト一式を下記からダウンロードいただけます。
Visual Studio Express 2013
for Windows Desktop 用VFD2002E表示サンプル プロジェクト ソース一式
参考技術情報
VB/.Netframework開発関連 参考情報
Visual Basic 2013 [VB2013]による開発情報
Visual Basic 2008 [VB2008]による開発情報
Visual Basic 2005 [VB2005]による開発情報
Visual Basic 6 [VB6]による開発情報
VBA [Excel2000/2003, Access]による開発情報
.Netframework開発情報
Windows は米国 Microsoft Corporation の米国およびその他の国における登録商標です。Microsoft
Corporationのガイドラインに従って画面写真を使用しています。
技術情報Index
シリアル通信関連 参考情報
シリアル開発
RS232シリアル情報
シリアル接続機器
その他参考
技術情報Index
Last Update :
2023/04/26
|