▼Visual Basic 6.0
ゼミにて、たしなむ程度にVBを扱えるようになったので、モーションエディタをVBで作ってみる事にした。その際、RCB1を参考に作っているが、既に似て非なるものとなりつつある。(^-^;
とりあえず、このモーションエディタの役目は、今までマイコンにガリガリ書いていたエディタを独立させることにある。機能も大切だが、そんなに時間をかけていられる場合でもないので、似たような機能を移植して、多少使いやすくしようと考えている。
何にせよ、ハイパーターミナルでは1行しか(プログラムの仕様上)表示できない。その「1行をいかにして表示するか?」に今まで時間を割かれていたようなものなので、今回やってみようと思い立った訳である。
▼バイナリ通信失敗
バイナリを送ったり、受信するのにChr関数を使ったが、129や250と言った値を送るとマイコン側からは0を返すし、ChrB関数を使うと何も帰ってこなかったりする。PCの受信側は、受信した値を数値で表すAsc関数や、16進数で表すHex関数を使っている。
このまま時間を食っていても仕方が無いので、現状ではこれ以上無理と判断し、16進数を一桁ずつ文字として送るようにした。考えてみれば、今までバイナリの通信など行っていなかったので、できないのは当然かもしれない。X-MODEMを行うプログラムを作った時も、バイナリではなく3桁の数字を送っていたのだから。
▼いしかわさんの書き込みから
先日、「バイナリなんて、無理だ〜!できるかこんなもん!」っと、さじを投げてしまった訳ですが、いしかわさん(*1)から書き込みがあった「StrConv関数(*2)」が何なのか分からなかったので、HELPとネット探索。すると、
VisualBasic初心者掲示板というのを発見。
ここで、バイナリの送信方法とかを調べた結果、Byte定義した配列に数値を入れていき、送信するだけでよい事が分かる。具体的には以下のような方法である。
Public Sub test()
Dim A(0) As Byte, i As Integer
For i = 0 To 255
A(0) = i
Form1.MSComm1.Output = A
Call wait(100)
Next i
End Sub
Public Sub wait(n)
Sleep n
DoEvents
End Sub
「なんだ・・・簡単じゃないか。」っと上記のプログラムを実行するとi=128にて、無限ループに入ったのか分からないがフリーズし、強制終了。「なんじゃこりゃー!?」っと誰もが思ったに違いない。(いや、あんただけだから(-_- ))
*1 知らぬ人はいないだろう。WEBページ、
思い立ったが吉日を運営しているのが、いしかわさん。愛機えんぱくの状況が気になる。(^-^;
*2 大文字を小文字にしたり、UnicodeをAsciiに変換したりする関数。StrConv(対象の値とか, 引数)という使い方をする。ちなみに、UnicodeをAsciiに変換したいのならば、引数の部分に128という値を代入するか、vbFromUnicodeという定数を代入すればよい。他の引数については、HELPで確認しよう。
▼戦いの果てに
先程の掲示板でさらに調べていくと、ある設定を忘れていたことに気づく。それは、MSComm1.InputModeの設定である。これをバイナリモードにしていなかったので、ダメだったらしい。つまりは・・・。
Private Sub Form_Load()
With MSComm1 'With(*3)
.PortOpen = True
.Settings = "38400,n,8,1"
.InputLen = 0
.RThreshold = 1
.SThreshold = 1
.InputMode = comInputModeBinary '←ココが抜けていた
End With
End Sub
と設定しなければならなかったのだ。この設定をやらないと、初期値が0(comInputModeText)になっているので、テキストデータしか送れないのだ。まぁ、タネが分かればこんなもんですな。
そんな訳で、問題なくバイナリによる通信が可能になった。いやぁ・・・楽で良いですな。余計な処理書かなくて良いし。(-_- )フッフッフ
*3 「With 省略したい名前」とすることで、End Withまでの名前などを省略できる。これを使うと書くのも楽だし、読み返すときも楽になる。(っと自分は思う。)
▼最終的に
いろいろとやった結果、以下のような感じで落ち着いた。
'標準モジュールにて宣言
Public DTX(16) As Byte
'これは好きなフォームなどにて
Private Sub Port_Output()
Dim i As Integer
DTX(0) = &H55
DTX(1) = &H1
For i = 0 To 3
DTX(i + 2) = PORT_N(i)
Next i
Call Check_Sum(6)
Call D_TX2(7)
Call wait(2)
End Sub
'以下は標準モジュールにて
Public Sub Check_Sum(n)
Dim D_CS As Integer
D_CS = 0
For i = 0 To n - 1
D_CS = DTX(n) + DTX(i)
If D_CS > 255 Then D_CS = D_CS - 256
Next i
DTX(n) = D_CS
End Sub
Public Sub D_TX2(n)
Dim A() As Byte, i As Integer
ReDim A(n - 1)
For i = 0 To n - 1
A(i) = DTX(i)
Next i
Form1.MSComm1.Output = A
End Sub
最後の「Form1.MSComm1.Output = A」は、このように書くとA(0)〜A(n-1)までの配列を連続して送れるようになる。しかし、普通にこれをやると、前回よりも少ないデータを送ろうとすると、過去のデータが残っているのでそれすらも送ってしまう。
そのため配列を再定義して代入し、それらを送信することにしている。自分自身もあんまり良く分かってないので、この辺の解説はこの辺で・・・(^-^;
[BACK]
[TOP]
[NEXT]
Copyright (C) 2005 U-hirohito All rights reserved.