パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

    VBアプリ実例集 (RS232C通信)

-----------------------------------------------------------------------------------------------
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活用研究目次