掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
RThresholdの場合分けをするには? (ID:111689)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
最近、RS-232Cの通信の話題が多いですが・・・ 今回のケースは、あくまで1バイトづつ取り込んで、それを、 一旦、バッファ(文字列)変数に蓄積し、その先頭から1バイ トづつ切り出して、これは1バイトのデータ、これは2バイト のデータ・・・と言う具合に判断していくしか無いはずです。 実際、プログラム書く側は、そのデータの素性が、1バイト系 データか、2バイト系データか知っているわけですから、その 非同期・同期化のバッファリングとデータ切り出し部分での、 本来のプログラミングと言うか、アルゴリズムの作成が醍醐味 のはずです。 おおまかに・・・ Option Explicit ' 通信用受信バッファ Private gBuffer As String Private Sub Form_Load() ' バッファクリア gBuffer = "" ' RS=232C初期化・オープン MSComm1.CommPort = 1 MSComm1.Handshaking = comRTS MSComm1.InputMode = comInputModeBinary MSComm1.Settings = "9600,n,8,1" MSComm1.RThreshold = 1 MSComm1.SThreshold = 1 MSComm1.PortOpen = True ' RTSの制御有りでオープンしているので ' 一応、制御信号をON MSComm1.DTREnable = True MSComm1.RTSEnable = True End Sub Private Sub Form_Unload(Cancel As Integer) ' 制御信号をOFF MSComm1.DTREnable = False MSComm1.RTSEnable = False ' RS-232Cクローズ MSComm1.PortOpen = False End Sub Private Sub MSComm1_OnComm() Dim sz As String ' 受信イベントを判定 If (MSComm1.CommEvent And comEvReceive) <> 0 Then ' 受信データの存在を確認 If MSComm1.InBufferCount > 0 Then ' 受信バッファのデータ数分を取得対象とする MSComm1.InputLen = MSComm1.InBufferCount ' 受信 sz = MSComm1.Input ' バッファに蓄積 ' UNICODE系の場合、データ変換を追加しないと ' 正しいデータにならない・・・要注意 gBuffer = gBuffer & sz End If End If ' データ判定・処理 Call CheckData End Sub Private Sub CheckData() Dim sz As String ' バッファにデータがあるか判定 If Len(gBuffer) = 0 Then ' 無ければ終了 Exit Sub End If ' バッファにデータが無くなるまで処理 While Len(gBuffer) > 0 ' まずバッファから1バイト切り出し sz = Left$(gBuffer, 1) ' データの判別:1バイト系か2バイト系か? ' 単純な判断ですが、最終的にはもっと複雑になる ' はずですが・・・ If sz = xxx Then ' 1バイト系データ処理 ' (ここに、1バイト系データ処理を書く) ' 処理済みのデータを、バッファから削除 gBuffer = Right$(gBuffer, Len(gBuffer) - 1) Else ' 取得済みのデータを、バッファから削除 gBuffer = Right$(gBuffer, Len(gBuffer) - 1) ' 2バイト目データ取得 sz = sz & Left$(gBuffer, 1) ' 2バイト系データ処理 ' (ここに、2バイト系データ処理を書く) ' 処理済みのデータを、バッファから削除 gBuffer = Right$(gBuffer, Len(gBuffer) - 1) End If Wend End Sub ※ あくまでアルゴリズムですから・・・ 参考までに・・・ 以上。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.