現在シリアル通信にて以下の設定で通信を行っています。
comSirial.CommPort = 1
comSirial.Settings = "9600,O,7,1"
comSirial.InputMode = comInputModeText
comSirial.EOFEnable = True
comSirial.InputLen = 0
comSirial.NullDiscard = False
comSirial.RThreshold = 1
comSirial.SThreshold = 1
comSirial.Break = False
comSirial.RTSEnable = True
comSirial.PortOpen = True
本来であれば20バイトのデータを受信しなくてはいけないところ
頭から8バイトのみしか受信できずON_COMM関数が呼ばれてしまいます。
comSirial.InputLen = 0 で受信バッファ全体を受信するまで
待ってくれるような設定だったとおもうのですが?どなたかご教授願えますでしょうか?よろしくお願いします。
その設定だと1byte受信したらON_COMMのcomEvReceiveでしょ
受信するデータが可変長なので
RThresholdに固定長を設定するわけには行かず
1を設定しているのですが
8バイト目までは一度に取れている状態です。
MSCOMMではどういった契機でデータ受信の終了を感知するのでしょうか?
データの受信の終了は感知しません。
なにをもってデータの終了かどうかはハードが決めるのでは?
ハードの仕様がわからないとなんともいえません。
RS-232Cのハードウェア側のFIFOバッファの都合やOSやマシンの性能の問題
があるのですが、RThreshold=1としても、必ず1バイト受信したら割り込み
が発生するわけではありません。それにそのようになったら、受信バッファ
オーバーランが発生したりしますし、その為にFIFOバッファをハードウェア
側で持たなくてはならなくなっているのです。
本題としては、ボーレートやマシンの性能にもよりますが、たまたま8バイト
目で受信したことをVB側が検知したと言うか、MSCOMM側の受信バッファに
入ったと言うところですネ!
では、その分を読み込んだあと、再度、あと12バイト分を受信しているはず
ですので、再度、受信割り込みのOn_Commが入ってくるはずです。
ですが、RThreshold=1でなれば、仮に、RThreshold=10とかしていて、残り
受信しなければならないデータが、8バイトであった場合、On_Commは発生
しません。要は、RThreshold=1でないと、受信割り込みは必ず起きないと
言うことになります。
あと今回の部分で受信したいデータが可変長であると言う部分では、相手の
モノが解らないのでなんとも言えませんが、パソコン側からコマンドを送信
して、その応答にデータを受信する場合は、予め受信しなければならない
バイト数は自分が知っているわけですから、そのバイト数を受信するまで、
ソフト的な受信バッファ変数に文字列を連結していき、予定バイト数になる
まで待つ方法しか無いでしょう・・・
コマンド等送信を行わず、ただ垂れ流しでデータを受信するなら、データの
末尾の区切り記号に相当するデリミタと言う何か文字が設定されていない場合
受信した文字列を繋ぎ合わせつつ、自分で、この辺が区切りだと思う部分まで
受信して、ソフト本体の方に渡すしかないでしょう。
不定長の文字列から所定のデリミタでトークンを切り出す・・・
と言う手法になるのですが・・・
とりあえずは、RThreshold=1にして、複数回のOn_Commで、受信したいデータ
を漏れなく受信させることから始まります。
頑張って下さい!
以上。
ハイパーターミナルでも8バイトしか受信できませんか?
ON_COMM受信を複数行い、PUBLICに格納しつつ
コマンドの最後につけたEOFを検知した時点で
受信完了という方法で落ち着きました。
ご教授ありがとうございました。
ツイート | ![]() |