• 締切済み

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

  • spen
  • お礼率66% (2/3)

みんなの回答

回答No.1

フレームの変数は何を使ってますか? また、MSComm.Outputにフレームを設定するときは、どのようにしてますか?

spen
質問者

お礼

結論から言うと~.outputへセットしたデータはちゃんと送られていました。 2byte毎に送られているように見えたのは、 受信側ソフトのデータの取り込み方に原因があったようです。 バイナリの送受信なので1byte受信毎にHEX関数で16進数へ変換し、TEXTで順次表示させるテストプログラムを作って相手側で動かしていました。 先程試しにテストプログラムの変わりに ハイパーターミナルで受信させてカーソルの動きを見てみたら、 カーソルが~.outputへセットした分ちゃんと動いていたので、 このテストプログラムに原因があると分かりました。 テストプログラムの問題を修正して 受信したデータをちゃんと表示するようになりました。 お騒がせしました そしてありがとうございました

spen
質問者

補足

1byteずつ送信の時: com1.Output = Chr(&HFF) com1.Output = Chr(fd.rw) com1.Output = Chr(fd.num) com1.Output = Chr(fd.size) com1.Output = Chr(fd.bd1) com1.Output = Chr(&HFF) (fd.rw、fd.num、fd.size、fd.bd1はbyte型の変数です) 1フレームまとめて送信の時(その1):   Dim buf() As Byte buf(0) = &HFF buf(1) = fd.rw buf(2) = fd.num buf(3) = fd.size buf(4) = fd.bd1 buf(5) = &HFF com1.Output = buf 1フレームまとめて送信の時(その2): Dim buf As String buf = Chr(&HFF) & Chr(fd.rw) & Chr(fd.num) & Chr(fd.size) buf = buf & Chr(fd.bd1) buf = buf & Chr(&HFF) com1.Output = buf です。

関連する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(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; 必要なファイル、設定

    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

  • VB6.0で音声発信したい

    VB6.0を使って、電話(音声)を自動でかけたいのです。 MSCommを使って、ポートを開いて電話をかけるところまではできたのですが、「ピー」という音がず~~と相手に聞こえてしまいます。 これはプログラムが悪いのでしょうか? それともモデムが悪いのでしょうか??? プログラムは以下の通りです。 MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" If MSComm1.PortOpen = False Then    MSComm1.PortOpen = True End If MSComm1.Output = "ATD" & 電話番号 & Chr(13) 申し訳ありませんが、ご教授ください。

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

  • シリアルポート通信

    VB6でシリアルポート通信を行っているものです。 22byteと26byteのデータをバイナリ受信したいのですが、異なるデータ長のデータをうまく取り込む方法がわかりません。 現状は、26byteのみで運用していたため InputLen=26 RThreshold=25 として運用していました。 22byteのときも26byteの時もスタートコード(02h)とエンドコード(0dh)が付きます。 この手のソフト制作が得意な方がいらっしゃいましたら、ご教示いただきたく。 InputLenとRThresholdの意味合いについてもご存じでしたら、教えてください。

  • 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

  • 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

  • ターミナルサーバーでの通信ポートエラーについて

    始めて質問いたしますので宜しくお願い致します。 ターミナルサーバー(Windows Server 2003 R2 SP2)上でVB5のアプリを動かしています。 FormからMSCommのコマンドにて通信ポート(COM1)のラベルプリンタ(SATO SR412)に 印刷を行うのですが1回目の印刷ではポートも正常に開けて印刷されますが フォームを閉じずにそのまま2回目を印刷した際に8012(デバイスが開けません)のエラーが 発生し印刷できません。 フォームを閉じると印刷は可能となります。 Windows XP SP3上で同じVB5のアプリを動かすとフォームを閉じなくても2回目の印刷が可能 となります。 ターミナルサーバー側の設定をどのように変更すればエラーが発生せず 印刷できるかご教授頂ける方、宜しくお願い致します。 ちなみにマイクロソフトのパッチ:838291は適用しています。 【デバッグを行った状態】 MSCommのコマンドにてデバッグを行った際、1回目の印刷時にはメッセージBOXで 状態を表示致しましたが正常にPortOpen=FALSEとなりポートがクローズされています。 2回目の印刷時にもポートがオープンされている場合にもPortOpen = Falseにて 一度、クローズしたのちPortOpen = Trueにて開こうとしていますがエラーとなります。 実行のコマンドは以下となります。 With X_oMSComm If .PortOpen = True Then .PortOpen = False End If .CommPort = 1 .DTREnable = True .RTSEnable = True .NullDiscard = False .Settings = "9600,N,8,1" .Handshaking = 0 .SThreshold = 0 .RThreshold = 0 .InputLen = 0 .PortOpen = True  ← このコマンドにてエラーとなります。 End With

専門家に質問してみよう