パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
-----------------------------------------------------------------------------------------------
Visual BasicによるRS232C通信プログラム(自作のシリアル転送Ver0.2.0)についてとりあげてみます。
従来のVer0.1.0は、旧型PC(FM-8,7, PC-98)などのテキストファイル等を、Windowsマシンに転送する
ことを主眼においていたので、機能的にやや特殊な部分がありましたが、Ver0.2.0では汎用的な機能を
盛り込んで、いろんな用途で汎用的に使えるようにしてみました。
Visual BasicでRS232C通信プログラムを作成する場合、MsCommコントロールを使用する方法と
API関数を使用する方法とがありますが、MsCommコントロールを使う方が格段に易しいので
このプログラムではMsCommコントロールを使用して作っております。
このページではまず、FORM1について解説します。FORM1にRS232Cによるデータ通信の基本機能を
実装しております。まずデザイン、コードについて概説し、最後に簡単に使用方法について触れます。
ファイルの保存、入力、送信といった機能はFORM3に実装しており、こちらはVBアプリ実例集(RS232C通信)2
で解説します。
RS232Cによるシリアル通信の基礎的なことは姉妹サイトの「パソコン120%活用・RS232Cプロジェクト」に
まとめてありますので、参照して下さい。
ここに掲載したプログラム(ソース、および実行ファイル)のダウンロード−> serial020.lzh
なお、上記実行ファイルの実行にはVB4のランタイムライブラリ(vb40032.dll,
vb4jp.dll)が必要です。
これらのランタイムライブラリがない場合はVectorの下記サイトにいくつかランタイムライブラリがあります
のでダウンロードしてお使い下さい。
http://www.vector.co.jp/vpack/filearea/win/util/runtime/index.html
-----------------------------------------------------------------------------------------------
1 Module1.bas
標準モジュールでは、グローバル変数として以下の2つを宣言しています。
q ( ) Binary mode時の受信データ用のByte型配列
y Binary modeでの受信時の受信データサイズのカウント用
Public q(60000) As Byte 'Binary mode時の受信データ用のByte型配列 Public y As Long 'Binary modeでの受信時の受信データサイズのカウント用 |
2 FORM1.FRM (serial020.frm)
1) デザイン画面
FORM1の概要 カスタムコントロールとしては、コムニケーションコントロール(MScomm32.ocx)を使用しております。 「ファイル送信:保存:読込」メニューを選択すると、ファイルの送信、保存、読込のための別のフォームが開きます。 ボーレート他のオプションボタンタンの選択で通信条件(プロトコル)を選定し、「Setting」ボタンを押すとその通信条件 が設定されます。 「送信」ボタンを押すと、送受信テキストエリアにあるデータが送信されます。 受信は、データが流れてくれば自動で随時受信します。チェックボツクスの「Binary Mode」がチェックされていると バイナリーモードでデータを受信します。バイナリモード受信時は「送受信テキストエリア」には、受信データ数が 表示されます。チェックボックスがチェックされていない時は、テキストモードで受信し、受信データは「送受信 テキストエリア」に表示されます。 「Text Clear」ボタンは「送受信テキストエリア」をクリアします。 「Binary Data Clear」ボタンは受信済みのバイナリーデータ(専用の変数に格納されている)をクリアします。 2) CODE (1) MsCommコントロールのプロパティ デザイン時のプロパティ設定です。 InputLen はデータの受信バッファから、Inputプロパティ(受信バッファからデータを取得する)で読み取る データ数を指定します。このプログラムでは1に設定していますので、1データ(1文字)づつ取得します。 RThreshold OnCommイベントを発生させる文字数(データ数)を指定します。nを指定すると、受信バッファにn文字 格納されるたびに、OnCommイベントが発生することになります。このプログラムでは1に設定していますので、1文字 受信するたびに、OnCommイベントが発生することになります。 OnCommイベントについては、(13)MSCommコントロールの、OnCommイベントで解説します。 すなわち、このプログラムの仕様としては、以下のようになっているわけです。 1文字(1データ)受信−>OnCommイベント発生−>1文字(1データ)読み取り
Begin MSCommLib.MSComm MSComm1 Left = 6000 Top = 3600 _ExtentX = 1005 _ExtentY = 1005 _Version = 327680 DTREnable = -1 'True InputLen = 1 RThreshold = 1 End |
(2) Formロード Formロード時に、通信ポートをオープンします。
Private Sub Form_Load() MSComm1.PortOpen = True End Sub |
(3)チェックボックス「Binary Mode」 チェックボックスがチェックされていれば(Check1.Value=1)、バイナリーモードでの受信(MsComm1.InputMode=1) に設定します。
Private Sub Check1_Click() If Check1.Value = 1 Then MSComm1.InputMode = 1 Else MSComm1.InputMode = 0 End Sub |
(4)「送信」ボタン 各オプションボタンの選択状況により、通信条件をセット(*1 MsComm1.Settings= )した後、送受信テキストエリアの 内容(テキスト)送信します(*2 MsComm1.Output=Text1.Text )。 Settingsは通信条件のパラメータを設定するプロパティで、文字列で、通信速度、パリティ、データ長、 ストップビットの順に記述します。 例えば、通信速度 9600ボー、パリティはノンパリティ、データ長 8ビット、ストップビット 1 の場合は、MsComm1.Settings = "9600,N,8,1" のように記述します。
Private Sub Command1_Click() If Option1.Value = True Then Baud = "300" If Option2.Value = True Then Baud = "600" If Option3.Value = True Then Baud = "1200" If Option4.Value = True Then Baud = "2400" If Option5.Value = True Then Baud = "4800" If Option6.Value = True Then Baud = "9600" If Option7.Value = True Then DB = "7" If Option8.Value = True Then DB = "8" If Option9.Value = True Then st = "1" If Option10.Value = True Then st = "2" If Option11.Value = True Then pari = "N" If Option12.Value = True Then pari = "E" If Option13.Value = True Then pari = "O" If Option14.Value = True Then MSComm1.Handshaking = 0 If Option15.Value = True Then MSComm1.Handshaking = 1 If Option16.Value = True Then MSComm1.Handshaking = 2 If Option17.Value = True Then MSComm1.Handshaking = 3 If Check1.Value = 1 Then MSComm1.InputMode = 1 Else MSComm1.InputMode = 0 MSComm1.Settings = Baud + "," + pari + "," + DB + "," + st ' *1 MSComm1.Output = Text1.Text ' *2 End Sub |
(5) 「終了」ボタン 通信ポートを閉じてプログラムを終了します。
Private Sub Command2_Click() MSComm1.PortOpen = False End End Sub |
(6) 「Setting」ボタン 通信条件(プロトコル)を設定します。 プログラムは「送信」ボタンと同様。
Private Sub Command3_Click() If Option1.Value = True Then Baud = "300" If Option2.Value = True Then Baud = "600" If Option3.Value = True Then Baud = "1200" If Option4.Value = True Then Baud = "2400" If Option5.Value = True Then Baud = "4800" If Option6.Value = True Then Baud = "9600" If Option7.Value = True Then DB = "7" If Option8.Value = True Then DB = "8" If Option9.Value = True Then st = "1" If Option10.Value = True Then st = "2" If Option11.Value = True Then pari = "N" If Option12.Value = True Then pari = "E" If Option13.Value = True Then pari = "O" If Option14.Value = True Then MSComm1.Handshaking = 0 If Option15.Value = True Then MSComm1.Handshaking = 1 If Option16.Value = True Then MSComm1.Handshaking = 2 If Option17.Value = True Then MSComm1.Handshaking = 3 MSComm1.Settings = Baud + "," + pari + "," + DB + "," + st y = 0 'Binary mode時の受信データ数のカウンタも初期化 End Sub |
(7) 「データ整列」ボタン カンマ( , )で区切られたデータをFomr2に見やすく表示するボタンですが、あまり使うことはないでしょう。 送受信テキストエリアに読み込まれた、カンマ( , )で区切られたデータを、16個づつを1行として表示し ます。行末に下2ケタのチェックサムも表示します。
Private Sub Command4_Click() tex$ = Text1.Text a = Len(Text1.Text): t = 0: tt = 0 For i = 1 To a b$ = Mid(tex$, i, 1) If b$ = "," Then t = t + 1 GoTo L1 Else qt$ = qt$ + b$ GoTo L2 End If L1: tt = tt + Val("&h" + qt$) qt$ = "" L2: tex1$ = tex1$ + b$ If t = 16 Then tex1$ = tex1$ + " :" + Right$(Hex$(tt), 2) + Chr$(13) + Chr$(10) t = 0: tt = 0 End If Next Form2.Show Form2.Text1.Text = tex1$ End Sub |
(8) 「TextClear」ボタン 送受信テキストエリアをクリアします。
Private Sub Command5_Click() Text1.Text = "" End Sub |
(9) 「CR送信」ボタン CRコードを送信します。
Private Sub Command6_Click() If Option1.Value = True Then Baud = "300" If Option2.Value = True Then Baud = "600" If Option3.Value = True Then Baud = "1200" If Option4.Value = True Then Baud = "2400" If Option5.Value = True Then Baud = "4800" If Option6.Value = True Then Baud = "9600" If Option7.Value = True Then DB = "7" If Option8.Value = True Then DB = "8" If Option9.Value = True Then st = "1" If Option10.Value = True Then st = "2" If Option11.Value = True Then pari = "N" If Option12.Value = True Then pari = "E" If Option13.Value = True Then pari = "O" If Option14.Value = True Then MSComm1.Handshaking = 0 If Option15.Value = True Then MSComm1.Handshaking = 1 If Option16.Value = True Then MSComm1.Handshaking = 2 If Option17.Value = True Then MSComm1.Handshaking = 3 If Check1.Value = 1 Then MSComm1.InputMode = 1 Else MSComm1.InputMode = 0 MSComm1.Settings = Baud + "," + pari + "," + DB + "," + st MSComm1.Output = Chr$(13) End Sub |
(10)「BinaryDataClear」ボタン Binary Modeで受信したデータをクリアします。
Private Sub Command7_Click() For i = 0 To 60000 q(i) = 0 Next y = 0 End Sub |
(11) 「送信:保存:入力」メニュー Form3を表示します。
Private Sub maski_Click() Form3.Show End Sub |
(12) 「About」メニュー このプログラムの概要について表示します。
Private Sub about_Click() a$ = "シリアル転送 Ver0.2.0" + Chr$(13) + Chr$(10) b$ = "COPY RIGHT TSUYOSHI KASAI" + Chr$(13) + Chr$(10) c$ = "制作 Visual Basic 2002/10" msg = a$ + b$ + c$ MsgBox msg, 0, "シリアル転送" End Sub |
(13) MsCommコントロール テキストモードでの受信時(MSComm1.InputMode = 0)は、 受信データを、送受信テキストエリア(Text1.Text)に書き込んでいきます。 バイナリーモードでの受信時(MSComm1.InpuMode = 1)は、 バイナリーモード受信時用のバイト型変数 q( ) に受信データを格納します。 OnCommイベントについて OnCommイベントは、通信イベント、通信エラーの発生により起こります。 通信イベントとしては、RThresholdで指定した文字数を受信した(すなわちデータを受信した) EOF文字を受信した、DtaSetReadyライン、ClearToSendライン、CarrierDetectラインの変化があった などがあります。 通信エラーとしては、Break信号受信、1文字リードする前に次の文字が到着した、受信バッファがオーバーフロー パリティエラーが発生、伝送バッファがいっぱいなどがあります。 どういう通信イベント、エラーが発生したのかは、CommEventプロパティで取得できます。 代表的なものは以下の通りです。
CommEvent値 | 意味 |
2 | RThresholdで指定した文字数を受信した(すなわちデータを受信した) |
3 | ClearToSendラインの変化 |
4 | DtaSetReadyラインの変化 |
5 | CarrierDetectラインの変化 |
7 | EOF文字を受信した |
1001 | Break信号受信 |
1006 | 1文字リードする前に次の文字が到着した |
1008 | 受信バッファがオーバーフロー |
1009 | パリティエラーが発生 |
1010 | 伝送バッファがいっぱい |
このプログラムでは、通信エラーのチェックなどまったくしておりませんので、通信速度が速いとデータの取りこぼし などが発生しますが、まったくノーチェックのままです。
Private Sub MSComm1_OnComm() Dim t() As Byte If MSComm1.InputMode = 0 Then j = MSComm1.Input Text1.Text = Text1.Text + j Else t() = MSComm1.Input ' *1 For i = 0 To UBound(t) q(y) = t(i) y = y + 1 Text1.Text = Str$(y) + "Byte Receive" Next End If End Sub |
*1 このプログラムの仕様では、受信バッファのデータは1文字(データ)づつ、Inputプロパティで取得することに なっているので、この部分は以下のようなコードでO.K.です。(上記コードは無駄なことをしている) t(0) = MSComm1.Input q(y) = t(0) y = Y+1 3 使い方概説 (1) データ送信 @ 通信条件を選択し、「Setting」ボタンをクリックします。 A 送受信テキストエリアに、送信したいデータを記述し、「送信」ボタンをクリックします。 (補足) 旧型PCの旧BASIC(F-BASICや N88BASIC)で受信する場合、CRコードがついていないと、変数にデータを 読み込みません。その場合は「CR送信」ボタンをクリックしてCRコードを送信して下さい。 (2) データ受信 @ 通信条件を選択し、「Setting」ボタンをクリックします。 A バイナリーデータを受信する場合は、チェックボックス「Binary Mode」をチェックして下さい。 B データは自動的に受信されます。バイナリーモードでの受信の場合は、データは受信データ用変数に格納され 送受信テキストエリアには、受信したデータのバイト数が表示されます。テキストモードでの受信時は、 送受信テキストエリアに、テキストデータが表示されます。 (補足) バイナリーモード受信時に、新たに次のデータまたは、ファイルを受信する時は、「Binary Data Clear」ボタンで 前に受信したデータをクリアして下さい。
Top Page | Visual Basic&Excel活用研究目次