MSCommで送信完了を検出する方法

このQ&Aのポイント
  • MSCommを使用して送信完了を検出する方法について知りたいです。
  • 送信完了を検出するためには、OutBufferCount=0を待つ必要があるのか疑問です。
  • 正しい方法を教えてください。OnCommのcomEvsendを使用せずに済む方法があれば知りたいです。
回答を見る
  • ベストアンサー

MSCommで送信完了を検出する方法

MSCommを使って送信したときの送信完了を検出したいのです。 mscPort.Output = xxxxx とすると送信バッファにxxxxxが書き込まれます(これは短時間で完了)が、 そのあとボーレートによる実送信(ボーレートにより長い時間)が実行されます。 この実送信の完了を知るためにOutBufferCount=0になるのを 待てばよいのかなと思って、 まずOutBufferCountの動作を知るために mscPort.Output = xxxxx Label1.Caption = mscPort.OutBufferCount と書いたら、Label1は即0と表示されました。 実送信は約4mSかかるのに即0と表示されるのは、実送信前に0になっているようで 理解できません。 Q1.私の考え方の間違いを教えてください。 Q2.正しい方法を教えてください。  (OnCommのcomEvsendによる方法もありますが、とりあえず、この方法は使いたくないのです。) よろしくお願いします。

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

  • ベストアンサー
  • uruz
  • ベストアンサー率49% (417/840)
回答No.1

送信バッファはMSCommにだけ存在するわけではありません。 送信データはMSCommのバッファ→ドライバーのバッファ→UART(ICチップ)内のバッファを経て送信されます。 ドライバーのバッファに充分な空きがあれば mscPort.Output = xxxxx でセットされたデータは一瞬でドライバーのバッファに転送されMSCommのバッファは空になります。

Kuma2000
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • MSCommでoutputできない

    VB6.0でMSCommを用いてシリアル(レーダとつながってる)にデータを送りたいんですがどうもうまく送れません.outputしてすぐoutbuffercountをチェックしてもcnt=0(cntは下記プログラム参照)のままでバッファにちゃんとデータが送れていないのでは?と悩んでいます. なにが原因なんでしょうか?もしくは,他に送信バッファにデータが届いてるかどうかをチェックする方法などご存知でないでしょうか?よろしくおねがいします. MSComm1.CommPort = 2 MSComm1.InputMode = 1 MSComm1.InputLen = 0 MSComm1.Settings = "9600,N,8,1" MSComm1.RThreshold = 1 MSComm1.PortOpen = True MSComm1.InBufferCount = 0 MSComm1.OutBufferCount = 0 Dim s(16) As Byte   ’←以下のデータを送りたいんですが・・ s(0) = &H2 s(1) = &H0 s(3) = &HA s(4) = &H0 s(5) = &H20 s(6) = &H0 s(7) = &H53 s(8) = &H49 s(9) = &H43 s(10) = &H4B s(11) = &H5F s(12) = &H4C s(13) = &H4D s(14) = &H53 s(15) = &HBE s(16) = &HC5 For j = 0 To 16 MSComm1.Output = s(j) cnt = MSComm1.OutBufferCount Next j End Sub あと,レーザーの説明書に ・レーザーに送信する2バイト間の時間間隔は6msを超えないように ・レーザーに送信する2バイト間の最小時間は55μs以上としてください という記述があるんですが,これを満たしてないという可能性も疑ってます. どうやれば,この時間のタイミングで送れるんでしょうか? 長くなってすいません,なにかヒントなどおねがいします.

  • 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イベント発生の時に させようとした場合、どうにも上手くうごきませんでした。 複数のコマンドを送信してその結果が返ってくるときに 各コマンドの結果を別々のテキストボックスなどに表示させたいです。 それにはバッファの値を必要な部分にわけ、抽出する必要があると思うのですが、 どのようにすれば実行可能でしょうか? 複数のレスポンスが一気に帰ってきた場合、 バッファからどのように必要データを取り出せばいいでしょうか?

  • MSCommのデータ送信

    申し訳ございません。 質問させていただいていた内容が解りにくいので再度、質問させてください。 接続しているデバイスがいないときのデータ送信の処理時間について質問がございます。 Dim Data$  Data$ = "Sample" MSComm1.Output = Data$ 'このステートメントを抜けるのに約10秒かかる。 RS-232C接続をしたデバイスにデータを送信します。 このとき、受信するデバイスが接続されいないときのデータ送信に時間が取られています。 通信デバイスのタイムアウトを設定するSetCommTimeouts関数は使用していません。 MSComm1.Outputのタイムアウトはどこで設定されていますか? 設定されているタイムアウト値を確認する方法はございますか?

  • MScommで上手く送信できない

    VB5.0、MScommでのバイナリデータの送受信です。 ~.Outputへデータをセットしても 2byteずつしか送信してくれなくて困っています。 どうすれば溜め込まずに送信するようになるのでしょうか あるいはバッファをフレッシュする方法は無いのでしょうか これはもうAPIを使用するしか方法が無いのでしょうか 1フレーム6~13byteの長さで1フレーム単位の送信です。 1byteずつ1フレーム分~.Outputへセットすると 頭の2byteが送信され、次の1フレームをセットすると その次の2byteが送信されます。 更に1フレームセットすると続きの2byte(最初のフレームの5byte目と6byte目)が送信されます。 1フレームを~.Outputへセットした後、 SThreshold=1とすることによるcomEvSendの発生と ~.OutBufferCountが0となることは確認しおり、 その状態で2byteしか送信していません。 1フレームまとめて~.Outputへセットしても同じで、 6byte長のフレームをセットした後、 12byte長のダミーデータを~.Outputへセットすると、 だけ2byte送信されるのではなく、 丁度フレーム全てが送信されたところで止まります。 この時、~.OutBufferCountは0になっています。 更にフレームを~.Outputへセットしていくと、 ダミーデータ→次のフレームの順で送信されます。 試しに1フレーム送信後に~.PortOpen = Falseで ポートを一旦閉じて見ましたが、3byte目以降を 吐き出してくれません。 再度~.PortOpen = Trueでポートを開き、 1フレームセットすると、先のフレームの続き (3byte目、4byte目)から送信されます。 通信の設定 .CommPort = 1 .Settings = "9600,N,8,1" .InputLen = 1 .RThreshold = 1 .InputMode = comInputModeBinary .comNone 他PCとはRD,SD,GNDのみ接続 送信されたかどうかは相手のPCで確認しています。

  • こんにちは、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)

    現在高速シリアル通信のプログラムを作成しています。なかなか検索で いろいろと探しているのですがデータ容量が増えるとどうしてもサンプル プログラムで同じ結果になってしまいます。 どういう現象かといいますと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 'あとはバイトデータを結合させて                    'おります。 データの送信や受信について教えていただきたいのですが特に受信側で 私が思うのでは送信データが早すぎて受信側が追いついていない状態 と思うのですが・・・ なにかいい方法や参考になるホームページ等がありましたら伝授お願いします。

  • mscommの受信バッファ異常について

    VB6に関する質問です。 以前VB6で制御していた検査設備があり(10年前ほど) 急遽それを動作させることになったのですが、QRリーダ(RS232C信号をcomportで通信) で読み取りを行うと、一度目はうまくいくのですが、 2度目以降は、前回の読み取り対象のQRコードないようが表示される問題が生じて困っています。 プログラムの流れとしては 1.timerでデジタル入出力を監視 2.入力信号が来たらQRリーダに読み取り命令 3.Oncommイベントが発生 4.受信内容をラベルに表示 というものです。 mscommのオブジェクトを新しく作りなおしたり、 リーダを変更したりしましたが、効果がありません。 詳しい方、原因の推測とその対処方法を教えてください。

  • コンポーネント’MSCOMM32.ocx’のエラー

    VB2010Expressをインストールして、 VB6.0のソフトを使おうとexeファイルをクリックしたら、 下記のエラーがでます。 どうしたらよいか、どなたかご存知ないでしょうか? おしえてください。どうぞよろしくお願いします。 【エラー表示内容】 コンポーネント’MSCOMM32.ocx’ またその依存関係の1つが適切に登録されていません。 ファイルが存在しないか不正です。 【試したこと】 1.窓の森より、VB6ランタイム(WinXP対応)をインストール 2.以下の方法でファイルを貼付け >また、実際必要なファイルは「MSCOMM32.OCX」という物なのですが、 >インターネット上からダウンロード出来ます。 >Googleで「MSCOMM32.OCX」、「DOWNLOAD」みたいな感じで >検索してファイルを落としてくださいね。 >そのファイルを「c:\windows\system32\」の中にコピーすれば完了です★

  • 高速な通信方法を教えてください

    MSCommを使って計測器のデータを取り込んでいます。タイマコントロールで40ms毎にデータ送信要求を出していますが、1秒間で20回くらいしかデータが受け取れません。通信速度を9600bpsから115200bpsまで変えても大して変わりません。MSCommかタイマのせいではないかと思っていますが、もっと早い通信ができる方法があればお教え下さい。

  • MSCommを用いたRS-232-Cデータ転送

    Visual Basic ver.6を用いてRS-232-Cデータ転送のプログラムを書いています。 転送には,MSComm controlを用いています。 コンピューター側から命令コードを測定器側に送信すると(例えば,MSComm1.OutPut = "F,3,300," & Chr(13)のように),測定器側からは次のようなテキストデータの転送が指定された回数だけ起こります: @C/R 数値データC/R 数値データC/R ・・・・ ・・・・ (指定回数繰り返す) そこで,質問ですが,このデータをMSComm1.Inputを介してきちんと取得する方法をお教えください。私がよく理解できいない部分は,「どのような形でbufferにデータが落ちているのか?」という部分と「繰り返し処理をどう記述するのか?」という部分です。多分後者は配列型変数を用いて「指定回数」だけ繰り返すことになると思いますが・・・・。 なお,データ転送の制御フォーマットはデータのみの転送で,STXもETXも使用していません。

専門家に質問してみよう