パソコンソフトのサンプル vega 2003.07.16〜
世の中進歩したのかUSBだLANだのが当たり前になって、シリアルポートなんて無くてもかまわない
なんてことになり、パソコンによってはCOMポートが付いていないのが珍しく無くなってきました。
しかしマイコンと接続するとなると、気軽に使用できるのはCOMポートですね。
パソコンソフトのサンプルです。 マイコンとデータの送信受信の送受信を想定しています。
VBA版、VB版、VC++版など色々ありますが、送信受信の方式は共通です。
マイコンが無い場合、モデムを相手にして動かすことも出来ます。私は動作確認でよく利用します。
クロスケーブルを使用して、パソコン同志でも可能です。COMポートが2つあるパソコンなら、COMポート
どうしを接続してもOKです。相手のソフトは、ターミナルソフトでもこれらのソフトでもたぶんOKです。
ただCOM1以外を使う場合は、オープンの所を直さないといけません。
マイコンとの通信は、高価な開発環境(VC++やVBなど)をよく使用しますが、office (エクセルやワード)
があれば、VBAが使用できるので開発環境を購入しなくても可能です。
尚、 下記サンプルは Win98SEとOffice97の環境で作成しました。
Win2000では動かないようです。
VBで作成したソフトをWindows2000動かしたところ、動作しませんでした。WindowsXPでも同じと思います。
ここで紹介している方法とほとんど同じ作り方です。(機能毎にSUBを作って呼び出す。)
色々試したところ、1つのSubでオープン、送受信、クローズと完結しないと動作しないことが分りました。
これは、OSの処理単位(タスク? スレッド?)の違いなのかもしれません。
VBAでも同様な方法で動くと思われますが、ここで紹介している方法(機能毎にSUBを作って呼び出す)からは
外れるので、ここで試すのは止めたいと思います。どうしても、自分のロクッジの中でAPIの使い方を意識して
作成する以外無いよいうです。(2004.12追記)
(1) パソコンソフトのサンプル
ダウンロード (PC01〜PC06)
56KB
送受信の方法は、私が作成したフーコーテスターや追尾ソフト(未完成)で使用している方式で、API(注1)を使用
しています。APIですから、VC++でも、VBでも、VBAでも使用できます。
今回使いやすく工夫したので、とても簡単に使用できます。 まずは使用してみて下さい。
VBAでの作り
ロジックは大きく2つに分かれています。
・フォームの部分 : 標準モジュールで定義した関数(SUB)を呼び出す形で通信します。
・標準モジュール: めんどくさいく難解なのを全部ここmod.txt に押しこめました。通常は見たり内容を理解する必要はありません。
使用方法を理解すればOKです。 説明は下記
また、標準モジュールは、VBと互換があります。
(A) PC01 VBAの例です。 マイコンに任意のコマンドを送信して、即受信する機能です。
エラー処理は一切ありません。
マイコン側は、キー入力が可能なソフトなら何でもOKです。ROMに書きこむか、モニター配下では起動後
ターミナルソフトを終了して下さい。
送信後0.5秒間待ってデータがこなければ受信終了します。
操作方法は、
@ 「ポートオープン」 ボタンプリック
A 送信データに文字列入力(複数可能でブランクでもOK)
B 「送信/受信」ボタンクリック マイコンから返事が来たら表示 (繰り返し可能)
C 「ポートクローズ」 をクリック
D 「閉じる」をクリック C省略でもOK
ソースはこれです。 (フォームに対応する全ソースで @BCD は操作に対応)
@ Private Sub
OPEN2_Click()
COM_OPEN
38400 ' ボーレート
38400BPIでオープン指定
End Sub
B Private Sub SEND_RCV_Click()
Dim SDT As String
' 送信データ文字数
Dim RDT As String '
送信データ
Dim RLEN As Long
' 受信データ文字数
SDT = TextBox1.Text
' 送信するデータをテキストボックスからセット
COM_IO SDT, 50, 500, RDT, RLEN '
送受信 *1
TextBox2.Text =
RTrim(RDT) '
受信したデータを表示
End Sub
C Private Sub CLOSE2_Click()
COM_CLOSE
' COMポートクローズ
End Sub
D Private Sub END2_Click()
COM_CLOSE
' COMポートクローズ
Unload UserForm1 '
フォームを閉じる
End Sub
簡単でしょう? これが理解できれば、きっとあなたもパソコンソフトが作成できると思います。
QCAMのフーコーテスターもほとんど同じ事をやっています。コマンドを送信し、返事を待つ。
青色の部分は、前述した標準モジュールで定義した関数(サブ)です。
*1 : 50が下のTIME1、500が下のTIME2
Excelなら受信した内容をシートのセルに埋め込むことも出来ます。
終了したあと Alr + F11
で ソースが見れます。(VBA編集)
(ツール -> マクロ -> Visual
Basic Editor でも可能)
(B) PC02(A)をVBで作成したものです。
(A)とほとんど同じです。標準モジュールは、(A)をコピーしたものです。
(C) PC03VBAでバイナリのデータも扱ったものです。
バイナリ用の送信受信関数を使用しました。
バイナリのデータを送信、受信する場合は、byte タイプのデータを使用しないと、データが欠落することがあります。
(D) PC04VBでのサンプルです。
定期的(1秒毎)にデータを受信します。
送信データは任意の時点で送信します。その時点でバッファに貯まったデータを取りこみます。
H8のgcc環境を実践された方は、サンプルのT04_clk(時計もどき)で使用して下さい。コマンド送信で時計を
合わす事ができます。
(E) PC05 VBAで(C)と同様なことをしています。
VBAではタイマーが使用できないので、割り込む処理(ボタン操作等)は、時々無視される場合があり、今一つです。
いつくるか分からないデータを受信する場合は、このパターンで作れば良いと思います。
受信データを無視することはありません。
(F) PC06 VC++で(D)と似たような機能を実現したものです。
これは、自動導入追尾ソフト(未完成)で使用している方式です。追尾ソフトでは、マイコンから望遠鏡の赤経赤緯等
を受信しています。
APIの部分の関数を uWincom.h にまとめてあります。
________________________________________________
どれも作りが少しずつ異なりますが、気に入った作りを参考にして下さい。
自動オープンだったり、オープンしていなければオープンするとか。
________________________________________________
タイムアウトの指定
受信時にタイムアウト用パラメータを指定します。これを上手く指定しないと、受信が終わったのに無駄に待ったり、
返事が来る前に時間切れで、受信できなくなります。
TIME1 : 受信データ1文字間のタイムアウト時間です。通常の連続で送られてくる場合は、50msでOKです。
この場合、受信が50ms途切れると受信終わりの扱いになります。
とぎれとぎれで送信されるデータを受信する場合は、TIME1を大きくすれば1度に受信できます。
TIME2 : 受信全体のタイムアウト指定です。
即受信データが返る場合でデータ数が少ない場合は、数百msでOKです。
マイコン側で処理に時間がかかる場合は、最低その時間を待たなくてはなりません。
例えばモータを回転したあと、OKのメッセージを受信する場合は、回転終了まで待たなくてはなりません。
又不必要に大きくすると、その間はオペレーションを受けつないので使いにくいものになります。
______________________________________________________
(注1) API : (Application
Interface)
Windowが提供するランタイムライブラリーで、各種の言語から利用できます。
VBA、やVBからは、使用方法を定義してから使用する必要があります。
OfficeやVBには使用方法(マニュアル)が付属してないので、使用しているもののみテキストファイル形式で
貼り付けたのをここに置きます。見にくいですが、無いよりましと思います。 区切りは@@@@@@の行です。
ここに関連APIの解説があります。
http://members.at.infoseek.co.jp/spectrum123/vb/vb_menu.htm スペクトラム電子工作のホームページ
______________________________________________________
標準モジュール 説明
1. (A)(B)(C)で使用しているもの
やっていることは、APIの定義とそれを使用した送受信の関数(サブルーチン)です。
通信Subの使用方法(引数の説明)
@ COM_OPEN オープン (失敗した場合は、メッセージが出ます)
RATE As String : ボーレート(BPI)
COM1固定になっています。
A COM_IO 文字送信 文字受信
SEND As String : 送信するデータ
TIME1 As Integer : 上記参照
TIME2 As Integer : 上記参照
RCV As String : 受信したデータ
RLEN As Long : 受信したデータ数
受信データの最大長は、100byteで内部で持っています。足りない場合は修正する必要があります。
このまま使用する場合で、100byte以上バッファに貯まっている場合は、次回以降の受信で取りこむ
ことができます。
B COM_CLOSE クローズ
又バイナリの送信受信する場合は
C COM_IOB バイナリ送信とバイナリ受信
bData() As Byte : 送信データ
slen As Integer : 送信データバイト数
TIME1 As Integer : 上記参照
TIME2 As Integer : 上記参照
rData() As Byte : 受信したデータ
RLEN As Long : 受信したバイト数
2. (D)(E)で使用しているもの
送信、受信を別々の関数に分けています。バイナリもそれぞれ分けています。
(E)には、ミリ秒取得のAPIを使用しています。
______________________________________________________
VBA自動起動(Excelの場合)
ワークシートを開いたとき自動的に起動する場合は
プロシジャエクスプローラーの thisWorkBookをダブルクリック
オブジェクトボックスからworkbookを選択
プロジジャボックスからopenを選択して下記を入力
Private Sub workbook_open()
UserForm1.Show
End Sub
_________________________________________________________
パソコンへの転送スピード
H8マイコンからパソコンへ送信する場合パソコンの処理が間に合わないと、データが欠落します。(TXD,RXDのみの結線の場合)
ターミナルソフトで表示速度が間に合っているかどうかは、マイコンをリセットした瞬間に表示が止まれば、間に合っています。
即止まらない場合はバッファに貯まったデータを表示しているからで、バッファがパンクすればデータが欠落します。(表示も乱れる)
マイコンから高速でパソコンに転送する場合は、マイコンをリセットした瞬間に表示が止まるように調整します。
自作のソフトでデータを受信する場合、少なくても2400byteまでは一回に読みこんだことがあります。(最大は不明)
このバッファがパンクしない限り、データを蓄えることが出来るので定期的にデータを読み込むこともできます。
いつ来るか分からないデータは、バッファがパンクしない周期で読み込めばデータの欠落は発生しません。