MSCommの受信について

このQ&Aのポイント
  • VB6.0でMSCommを使って受信データを処理する際に、連続データ読み込みが正しく動作しない問題が発生しています。
  • 文字列操作関数を使用してデータを分割することは可能ですが、実際にシリアル通信でデータを受け取る際には上手く動作しないようです。
  • 複数のコマンドの結果を別々のテキストボックスなどに表示するには、バッファの値を必要な部分に分割して抽出する必要があります。どのように実行すれば良いでしょうか?
回答を見る
  • ベストアンサー

MSCommの受信について。

VB6.0でMSCommを使っています。 受信データが例えば「00000 00000 000001111122222」 というようなレスポンスが帰ってくるのですが、これは元々 連続データ読み込み(RDSコマンド)で3個読み出したときの結果が 「00000 00000 00000」 次にある番地に書き込んだ値を読み出すコマンドでの結果が 「11111」と「22222」となっています。 これを連続して送信しているので、バッファにはこのように後ろに追加されています。 これをOncommイベントが発生した時に Buffer=MSComm1.Input としてBufferに保存していますが、その後、文字列操作関数を使って 3つを分割しようとしても上手くいきませんでした。 一応、実験としてボタンをクリックした時に str="00000 00000 000001111122222"とデータを入れ、 文字列操作関数を使ってこれを3つに分割することは可能でした。 なので、アルゴリズム的に間違っているというわけではないようですが、 それを実際にシリアル通信させ、Oncommイベント発生の時に させようとした場合、どうにも上手くうごきませんでした。 複数のコマンドを送信してその結果が返ってくるときに 各コマンドの結果を別々のテキストボックスなどに表示させたいです。 それにはバッファの値を必要な部分にわけ、抽出する必要があると思うのですが、 どのようにすれば実行可能でしょうか? 複数のレスポンスが一気に帰ってきた場合、 バッファからどのように必要データを取り出せばいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

InBufferCountで必要なバイト数のデータが受信されたかを確認し、 InputLenで読み込むバイト数を指定して Inputで読み込むという方法ではうまくいかなかったのでしょうか?

usui323
質問者

お礼

InBufferCountの使い方を良く分かっていませんでした。 解決しました。ありがとうございました。

関連するQ&A

  • MSComm

    1. MSComm1.CommPort = 1 COMポートで設定している値は整数値でしょうか? COM2、COM3など汎用性を持たせたいのですが、Int方への変換で、必要な文字列を切り出して文字列変数をInt型に変更したいのですが、 下例で良いですか? Dim Buffer$ Buffer$ = "COM1" Buffer$ = Mid(Buffer$, 4, 1) MSComm1.CommPort = CInt("Buffer$") 2. 通信速度 57600bpsで通信したいのですが、定義では56000bpsになります。 MSCommを使用すると、57600bpsがだせないのですか? 以上 宜しくお願いいたします。

  • こんにちは、VBはじめたての初心者です。MSCommコマンドを利用して

    こんにちは、VBはじめたての初心者です。MSCommコマンドを利用してマイコンと 通信するプログラムを作成中なのですが、わからないことがあるので質問させていただきます。 public aub form_load() MSComm1.CommPort = 3 'ポート番号設定 MSComm1.Settings = "115200,N,8,1" '設定 MSComm1.PortOpen = True 'ポートオープン MSComm1.Handshaking = comNone 'フロー制御無し MSComm1.RTSEnable = False 'RTS制御無し MSComm1.RThreshold = 1 '1バイト受信毎にOnCommイベント発生 Dim txBuffer As String End sub 'テキストに表示した受信文字列を変数に格納、さらに必要な文字列だけ抽出する Private Sub botan_Click() txBuffer = Text2.Text x = InStr(1, txBuffer, "e" & vbCrLf, 1) txBuffer = Mid(txBuffer, x + 3, (Len(txBuffer) - (x + 2))) Text1.Text = txBuffer 'txBufferの内容確認用 End Sub Private Sub cmdr_Click() Text2.Text = "" MSComm1.Output = "r a0 s 00 j ff" & Chr(13) 'マイコンのデータを読み込むコマンド End Sub Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive Buffer = MSComm1.Input Text2.Text = Text2.Text & Buffer ・ ・ ・ End Select End Sub おおざっぱですがこのようなプログラムをつくりました。 目的は受信された文字列(テキストに表示)を変数に格納、さらに必要な文字列だけ抽出する ことなのですが、このプログラムだとデータを読み込むコマンドを送るボタンとそのデータを 変数に格納して必要な部分を抽出するボタンを二回押さなければならず面倒なので、botan_Click() の中の命令をそのままcmdr_Click()に入れたのですが、そうするとエラーが出てしまいます。 いろいろと試したのですがどうやらtxBufferの中に受信データが入ってくれないみたいです。 原因は何か。何かいい方法がないかアドバイスいただけたら幸いです。 やりたいことは、一回のボタンクリックで変数に受信データのほしいとこだけを格納させることです。 よろしくお願いします。

  • MScommのOncommイベントが発生しない

    ACCESSでMScommオブジェクトを使用し、ある機器からデータの読み取りを行いたいのですが、肝心のOncommイベントが発生いたしません。 なにか、ライブラリの参照設定が必要なのですか? それとも、自分の設定間違い(不足)なのでしょうか? 前にVBでMScommを使用したことがありますが、なにも特別なことはしなかったような・・・(MSCOMM32.OCXを使用しています) 補足が必要であれば、追記いたします。

  • MSCommのCommEventプロパティ

    質問させてください。 ↓コードで、通信エラーのイベントを取得したいのですが、COMポートは正常に機能しているのですが、comEvReceiveに正しい値(0)が 入らずにデータ受信ができません。 対策を教えていただけませんか? Dim Buffer As String Do '5桁受信するまで待機 DoEvents Loop Until MSComm1.InBufferCount >= 5 MSComm1.RThreshold = 1 Select Case MSComm1.CommEvent '通信ポートのチェック Case comEvReceive 'OK Buffer$ = MSComm1.Input Case Else 'NG ・ ・ End Select

  • rs232cでの受信データ(mscomm)の受信方法VB6

    VB6で、シリアル通信プログラムを作っています。 機器からレスポンスが、02 00 44 03 61 62 63 03 72 0Dと9バイトくるのですが、 8バイト受信した後に、また、最後の0Dを1バイト目として受信しているので困っています。 on commイベントで以下のようにして受信データをテキストボックスに表示しているのですが、 Select Case MSComm1.CommEvent   Case comEvReceive       Dim Buffer() As Byte       Buffer() = MSComm1.Input       For t = 0 To 6 + Buffer(3)  ,BUffer(3)はデータ長です。       Text1.Text = Text1.Text & Hex$(Buffer(t)) & Chr(&H3A)       Next t 8バイト表示した後、1バイト受信が起こるので、Buffer(3)が範囲外となりエラーが起こります。 inputLenは0にしています。 この問題は解決するにはどうしたらよいでしょうか? 0Dは終了コードです。0Dを受信するまで、きちんと1バイトづづ格納していくなどというようにできたらよいのですが、、、 他にも簡単な方法があったらよいのですが、、、 よろしくお願いいたします。

  • MSComm; 必要なファイル、設定

    VB6で、ActiveXファイルを作成しています。 デバッカーでは、問題なく動作します。 CABファイルを作成して、ファイルをダウンロードさせて動作させると データ送信は、できるのですが受信データが取得できません。 Do - Loop処理を繰り返しているようです。 必要なファイル、プロパティ設定などございますか? ご意見をお願いします。 CABの中身; TEST.OCX ASYCFILT.DLL COMCAT.DLL MSMASK32.OCX MSMSKjp.DLL MSPRPJP.DLL msstdfmt.dll MSSTKPRP.DLL MSVBVM60.DLL OLEAUT32.DLL OLEPRO32.DLL VB6JP.DLL MSComm1.CommPort = 1 MSComm1.Settings = "9600,N,8,1" MSComm1.PortOpen = True MSComm1.InBufferCount = 0 MSComm1.InputLen = 1 '-----Outputプロパティによるデータ受信 MSComm1.Output = (STX) & "CMD" & (CR) '-----Inputプロパティによるデータ受信 Dim Buffer$ Do DoEvents If MSComm1.InBufferCount Then Buffer$ = Buffer$ & MSComm1.Input Select Case Buffer$ Case Chr(13) Exit Do Case Else End Select End If Loop

  • MSCommについて

    ↓例の桁数、データブロックが不定で連続して受信されます。 最後の1桁は(ETX)です。 (STX)XXXXXX...(ETX)(STX)XXXXX...(FS)XXXXX...(ETX)(STX)XXXXX.......(FS)XXXX...............(ETX) すべての桁数、データブロックが対象なので一度に受信します。 1. 質問はInputプロパティで1桁ずつデータをREC変数に読み込んで、ある条件で、Loop分を抜けたいのですが、 VB6の定義方法がわかりません。 1-1.最後の(ETX)の読み込み 1-2.先頭30桁  MSComm1.InBufferCount = 0 MSComm1.InputLen = 1 Dim REC As String Do DoEvents If MSComm1.InBufferCount Then REC = REC & MSComm1.Input If ..... '最後の(ETX)の読み込み '先頭30桁 Exit Do End If   End If Loop 2. スピート重視で処理するために、InBufferCountに値があったら、すべての受信データをRECにいれたいのですが 取得できていません。 アドバイスはございますか? MSComm1.InBufferSize = 2048 MSComm1.InBufferCount = 0 MSComm1.InputLen = 0 Dim REC As String Do DoEvents If MSComm1.InBufferCount >= 1 Then Exit Do End If Loop REC = MSComm1.Input

  • VB RS-232C 通信プログラム

    何度もお世話になっております。(VB6.0 MSCommを使用した通信プログラムを作成中です。)私は新卒で食品会社に入社したのですが,プログラムの分かる上司が身近では誰1人といない状況で困っています。 今作成しているのは,重量計に荷物が乗った段階で作業者がデータ転送ボタン(重量計についている)を押すと,重量計のデータ(500kgというデータ)をシリアルでCOM1に取り込み,フォームにエクセルのセルを作成し(OLEを用いて)保存できるようにしたいと考えています。 (重量計から送られてくるデータのフォーマット) 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 S T , N T , + 0 0 1 2 . 3 4 k g CR LF ST ; ヘッダ1 NT ; ヘッダ2  CRLF ; ターミネータ                   の18バイトのデータです。 ここで質問なのですが (1) 以下のプログラムで重量はバイト配列に受信できていますでしょうか?(実際に重量計とPCを接続できれば良いのですが工場の稼動状況が関わっておりすぐにはできません。) (2) 18バイトのデータを受信するからと言って RThreshold = 18 として良いのでしょうか? 普通,データは1バイトずつ送られてくると思うので RThreshold = 1としてイベントを発生させる必要があるのかとも思うんですが。 'MSComm1,2(COM1,2)コントロールの初期設定 Private Sub Form_Load() MSComm1.CommPort = 1 '通信ポートを設定 MSComm1.Settings = "9600,n,8,1" '通信条件の設定 MSComm1.RThreshold = 18 '固定長のデータ End Sub Private Sub Port1_Click() 'Port1_Clickのクリックイベントプロシージャ If MSComm1.PortOpen = False Then 'シリアルポートのオープン MSComm1.PortOpen = True End If LPort1.Text = "" 'テキストボックスのクリア受信 End Sub Private Sub MSComm1_OnComm() '受信のOnCommイベント Dim Buffer1(0 To 17) As Byte '受信バッファの変数宣言(18バイト) Select Case MSComm1.CommEvent 'CommEventプロパティに対する処理 Case comEvReceive '受信データ有り    Buffer1 = MSComm1.Input '受信データをバッファに格納 'これより下は受信した18バイトから必要なデータ8バイト目から4バイト分切り出し,dという配列(4バイト)に格納できないかと考えました。 Dim i As Integer Dim d(0 To 3) As Byte d = MidB(Buffer1, 8, 4) LPort1.Text = d 'LPort1.Text = Buffer1 '受信データをテキストボックスに表示 End Sub

  • VB6.0のGPSシリアル通信について

    はじめまして。 VB6.0で、GPSシリアル通信を行っています。 シリアル設定は、MSComm1.Settings = "4800,n,8,1" にしています。 1秒毎にGPSデータは受信でき、すべて受信できています。 ただし、このGPSデータは、1秒間に下記のように6行分受信されます。 $GPRMC,131850,A,3603.5404,N,14008.5746, $GPGGA,131850,3603.5404,N,14008.5746, $GPGSA,A,3,27,09,02,05,21,29,10,15,,,, $GPGSV,3,1,11,27,27,193,33,09,13,199, $GPGSV,3,2,11,21,18,317,23,29,14,259,22, $GPGSV,3,3,11,07,01,033,00,18,00,295,00,28 そこで、上記6行分のデータのうち、初めの2行分だけを取り出したいと思っていますが、どうもうまくいきません。 どのようにすれば、初めの2行分だけを取り出すことができるでしょうか? 下記がソースです。 Private Sub MSComm1_OnComm() Dim Buffer1 As Variant Select Case MSComm1.CommEvent Case comEvReceive Buffer1 = MSComm2.Input If (InStr(Buffer1, "GPRMC")) Then Debug.Print Buffer1; Else (InStr(Buffer1, "GPGGA")) Then Debug.Print Buffer1; End If End Sub どなたか教えてください。 よろしくお願いします。

  • 高速シリアル通信での大容量のデータ転送について(mscomm)

    現在高速シリアル通信のプログラムを作成しています。なかなか検索で いろいろと探しているのですがデータ容量が増えるとどうしてもサンプル プログラムで同じ結果になってしまいます。 どういう現象かといいますと10000バイトぐらいのデータを転送するとどう してもデータ上のかけ落ちが発生します。 ボーレート:38400 or 19200bps データビット:8Bit パリティ:なし ストップビット:1Bit フロー制御:XonXoffRTSCTSあり データはバイナリィ転送です。 ==>送信側のプログラムでは以下通りです。   'バイナリデータファイルを読み込み For i& = LBound(bytBuf) To UBound(bytBuf) bytedata(LineCnt) = bytBuf(i&) If (LineCnt < 255) Then '255バイトずつ分割して送信 bytedata(LineCnt) = bytBuf(i&) Else 'タイマー処理(wait制御) MSComm1.Output = bytedata LineCnt = 0 bytedata(LineCnt) = bytBuf(i&) End If LineCnt = LineCnt + 1 Next i& 'WAIT掛けたり分割してデータを転送したり一括でデータを転送したり 行っています。 ==>受信側では以下の通りとなっております。 Select Case MSComm1.CommEvent    Case comEvReceive '受信データの取得 Buffer = MSComm1.Input 'あとはバイトデータを結合させて                    'おります。 データの送信や受信について教えていただきたいのですが特に受信側で 私が思うのでは送信データが早すぎて受信側が追いついていない状態 と思うのですが・・・ なにかいい方法や参考になるホームページ等がありましたら伝授お願いします。

専門家に質問してみよう