VB6.0でMSCommを使ってシリアルにデータを送信できない問題

このQ&Aのポイント
  • VB6.0のMSCommを使用してシリアルにデータを送信したいがうまくいかない。送信するデータが正しくバッファに送られていない可能性がある。
  • MSComm1.CommPortを2に設定し、データの送信準備をする。送信データをバイト配列に格納し、ループで1バイトずつ送信していくが、バッファのカウントが途中で0のままになる。
  • 問題の解決方法として、送信データのタイミングや時間間隔に注目する。レーザーの説明書には、2バイト間の時間間隔が6msを超えないようにし、最小時間は55μs以上を保証するようにと書かれているため、それに合わせた設定が必要と思われる。
回答を見る
  • ベストアンサー

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以上としてください という記述があるんですが,これを満たしてないという可能性も疑ってます. どうやれば,この時間のタイミングで送れるんでしょうか? 長くなってすいません,なにかヒントなどおねがいします.

  • snuf
  • お礼率75% (12/16)

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

  • ベストアンサー
  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.1

DTR が、下がってたりしてませんか? ケーブルの結線図もありそうです。確認して下さい。 >・レーザーに送信する2バイト間の時間間隔は6msを超えないように  だって、キャラクタ間まで注意書きつきですから・・ >どうやれば,この時間のタイミングで送れるんでしょうか?  このボーレートで、このプログラムなら時間関係はOKと思います。 >チェックする方法などご存知でないでしょうか? PCを2台使ったり、クロスケーブルでCOM1とCOM2を接続する手や、モデムとATコマンド/レスポンスをやりとりする方法があります。 私もはじめ、MSComm の自分勝手な動作には、参ったことがあります。 MSCommのプロパティページの内容、RTS/CTSの設定など、補足があれば、詳細に回答できるかも知れません。 とりあえず、OnCommイベントの中で、送信(した後)のイベント種類を確認してみて下さい。 また、 MSComm1.Output = chr$(s(j)) と文字列で送信した場合の結果もわかるとなおよいです。 >Output プロパティ >送信バッファに文字列を書き込みます。 なので・・

snuf
質問者

お礼

どうもありがとうございます。2日ほど留守にするので、その後、ご指摘いただいた点について調べてみたいと思います。また、よろしくおねがいします。

その他の回答 (1)

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.2

回答ではないですが参考までに COMが2個あるのならCOM1とCOM2を クロスケーブルで繋いで片方でフリーのターミナル ソフトを動かせばデータが来てるかどうか判ります。

snuf
質問者

お礼

遅くなって申し訳ありません.アドバイスありがとうございました. 原因が判明しましたので締め切らせていただきます. どうやら原因は使用していたPCカードが特注で,ボーレート設定を2150にしなければいけないということでした. しかし,VBでどうやって2150bpsを設定するのかわからず困っています. 別の質問として「ボーレートを2150にしたい!」を投稿させてもらいました. また,よろしくおねがいします.

関連するQ&A

  • 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で確認しています。

  • MSCommで、文字化け

    こんにちは。いつも質問ばかりで恐縮ですが・・・ VB6(SP5)で、プログラミングをしております。 MSCommが文字化けをして困っております。 TA=NTT:V70MAX Windows2000 下記の通り、プログラミングをしています。文字化けがしない時は、ずっと うまく行きます。が、一度文字化けをしてしまうと、Windowsの再起動等を しなければどうにもなりません。(“・エZ・”等になります) Private Sub Form_Load() ‘初期化 MSComm1.CommPort = 1 MSComm1.Settings = "9600,N,8,1" MSComm1.Handshaking = comRTS MSComm1.RThreshold = 1 MSComm1.InputLen = 0 MSComm1.PortOpen = True End Sub Private Sub MSComm1_OnComm() Dim wBuf As String If MSComm1.CommEvent = comEvReceive Then wBuf = MSComm1.Input Text1.Text = wBuf End If End Sub

  • 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

  • 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の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

  • MELSEC-QシーケンサをVBAで通信したい!

    三菱のシーケンサMELSEC-Qシリーズのシーケンサ「QJ71C24N」にエクセルVBAで 通信したいと考えています。なかなかうまくいかず、困り果てています・・・。 下記、進めてきた経緯と組んだプログラムを書きます。 どこがおかしいか、どなたか教えてください・・・ ■ゴール シーケンサ内部のM300という変数に格納されている値を、VBAで作成した テキストボックスに表示させたい。 1.使用するエクセルのバージョンは2003です。 MSCOMMが入ってなかったため、「vb6sp6rt4.exe」というランタイムを用いて MSCOMMはインストールできました。 2.以下プログラム Dim R As String Private Sub CommandButton1_Click() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True MSComm1.inbuffercount = 0 ' 0文字受信するまで待機 MSComm1.output = Chr$(H5) + "F90000FF0004010000D*0010200050" + Chr$(H31) + Chr$(H43) End Sub +でいいのでしょうか?&というのも見ましたが・・・。 一応下記の通りだと取扱説明書をみながら、進めました。 'chr$(H5):制御コードENQuiry(問合せ):ヘッダ 'F900:識別番号+フレーム+局番号 '00FF:ネットワーク番号+PC番号 '00:自局番号 '0401:コマンド(一括読み出し) '0000:サブコマンド(モニタ条件指定無し、デバイスメモリ拡張指定無し) 'D*:デバイスコード '001020:先頭デバイス '50:デバイス点数 ' Chr$(H31) + Chr$(H43):サムチェックコード ↓ここからが、テキストボックスへの表示になりますが・・・。これもうまくいかず。 Private Sub CommandButton2_Click() R = MSComm1.input text1.Text = R text2.Text = Mid$(R, 6, 4) End Sub そして、ポートオープン。これは、エラーが出ず、うまくいったと考えています。 Private Sub Form_Load() Sheets("Sheet1").Select MSComm1.DTREnable = True MSComm1.RTSEnable = True MSComm1.inputLen = 0 'Input プロパティ使用時に、バッファ全体を読み取る。 MSComm1.commport = 1 'これは必要かと考え、テキストにはないが追加。 MSComm1.Settings = "9600,N,8,1" MSComm1.portopen = True End Sub そして、ポートクローズ。こちらも、エラーが出ず、うまくいったと考えています。 Private Sub CommandButton3_Click() MSComm1.portopen = False End Sub 最大の問題は、しっかりとコードが送信できているのかというところです。 解らないところも多々あるため不明な点も多いですが、なにとぞ、教えてください。

  • MSCommのデータ送信

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

  • こんにちは、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の中に受信データが入ってくれないみたいです。 原因は何か。何かいい方法がないかアドバイスいただけたら幸いです。 やりたいことは、一回のボタンクリックで変数に受信データのほしいとこだけを格納させることです。 よろしくお願いします。

  • RS232CでのRFIDリーダライタの制御プログラム。

    研究用にタカヤ製品http://www.takaya.co.jp/enterprise/rf/rfid/module.htm のRFID評価キットTR3-D002Aを購入しました。 ↓のようなVB6.0で16進数のバイト列を送信してレスポンスをえるプログラムを作りました。 MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.Handshaking = comNone MSComm1.PortOpen = True Dim Send(7) As Byte Send(0) = &H2 Send(1) = &H0 Send(2) = &H4F Send(3) = &H1 Send(4) = &H0 Send(5) = &H3 Send(6) = &H55 Send(7) = &HD MSComm1.Output = Send 通信プロトコルはあっていると思うし、COMモニタでみても、ついてきたデモソフトと同じ信号が出力されているので、 リーダライタからレスポンスのデータが帰ってくると思うのですが、COMモニタでみる限り何もレスポンスはないです。 プログラミングは初めてなのもあり、困っています。 何か特殊なことをしないと、こういうSDKが別売であるような機器を制御するのは無理なのでしょうか? また、原因は何が考えられるでしょうか?

  • 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による方法もありますが、とりあえず、この方法は使いたくないのです。) よろしくお願いします。