• 締切済み

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

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

みんなの回答

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.3

忘れてました。 > 4.受信内容をラベルに表示 新しいデータを表示する度にラベルをrefreshしていますか。

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.2

> 1.timerでデジタル入出力を監視 > 3.Oncommイベントが発生 1だとタイマーを使ったポーリング方式、3だと割り込みを使ったイベント ドリブン方式の様に読み取れ、方式が混在しているような感じですが。 MSComm1.Inputを使った場合、バッファは読み出し後にクリアされますから > 2度目以降は、前回の読み取り対象のQRコードないようが表示される問題 読み出しではなく表示の処理に間違いがある可能性がありますね。 あるいはバッファからの読み出しは別な特殊な方法を取られているのでしょうか。 下記などを参考にしてみてください。 http://support.microsoft.com/kb/411403/ja http://www.picfun.com/serial04.html

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

ソフトに何らかの誤りがあると思われます。 OnCommイベントの記述の中に 「MsComm1.Input」 という記述があるはずです。 この一行により、受信バッファの内容を取り出すことが出来ます。 ここで指定されている変数の内容 たとえば、以下のような記述の場合receiveBufの中身は、 実行後どのようになっているでしょうか。 receiveBuf = MsComm1.Input ここが、読み取った内容と一致しているのであれば ラベルに表示させるまでの処理に不具合があると推測できます。 一方常に同じであるならば、まったく違った原因が考えられます。 (ちょっと思いつかないですが・・・)

関連するQ&A

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

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

  • 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で、文字化け

    こんにちは。いつも質問ばかりで恐縮ですが・・・ 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オブジェクト に関して。

    MSCommオブジェクト に関して。 VBのMSCommオブジェクト に関して 質問です。 私は、岩通計測(株)のオシロスコープ DS-5102用のサンプルソフト(下記URL) デジタル・オシロスコープ DS-5100シリーズ用 RS-232 サンプルプログラムExcel VBA Ver.1.01 http://www.iti.iwatsu.co.jp/ja/download/ds5100_RS_VBA.html#down0 を使用して、パソコンにオシロスコープの波形情報を 取り込もうとしているのですが、 上手く、このソフトで、波形情報を取り込むことが 出来ません。 メーカーに問い合わせてのですが、 Excelのコントロールツールボックスを表示させ、 デザインモードにしたとき、MSCommオブジェクト(電話機の絵)は、 Excelシート上に表示されますか?。 っと聞かれ、 MSCommオブジェクト(電話機の絵)が表示されません っとお答えすると 表示されていなければ MSCommオブジェクト(電話機の絵) が削除されている可能性があります。 改めて、 こちらのPC環境 Microsoft Office Excel 2003(11.8169.8172)SP3 MSCommオブジェクトが貼りついているのを確認して 保存し直したExcelシートを添付致します。 こちらで、試してみて頂けますか。 っと言われ、試したのですが、 やはり、MSCommオブジェクト(電話機の絵) が表示されないのですが、何方か解決策を お知りの方は、いらっしゃいませんか?。 改めてMSCommオブジェクト(電話機の絵)を挿入、 インストールしなければならないなら、 そうしますし、どうか解決策を宜しく御願い致します。 ちなみに、このような状況で、上記のソフトを 起動すると下記のようなエラーが出ます。 『コンパイル エラー: ByRef引数の型が一致しません。』

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

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

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

  • RS-232CのMSCommについて

    Access2003で、RS-232Cを使いプリンタに出力するソフトを開発しているですが、 「このコントロールにはオブジェクトがありません。」というメッセージが出るようになりました。 原因を調べると、 フォームに貼り付けた、ActiveXコントールのMSComm(Microsoft Communications Control version6.0)アイコンが、本来なら電話のワークをしているのに、真っ白になっており、ダブルクリックしてもプロパティが表示されません。 また、一旦その真っ白のアイコンを削除して、新しいアイコンを貼り付けようとするのですが、今度は「Microsoft Office Accessでは、このActiveXコントロールはサポートされていません。」と表示されて、使用すらできなくなりました。 つい3週間ほど前までは、エラーも出ず、プリンタから出力できていたのですが、 どのような原因が考えられるでしょうか? OSはXP、Office2003で、VB6.0です。VB2008をインストールしていましたが、影響を受けているのかと思いアンインストールしています。

  • VB2005によるRS232C制御

    VB2005でZX-800L(TAKASAGO)を動かしたいのですがポートオープンできません。(オープンできるとREMOTOが点灯するはずなんですが…) 現在MSCommまたは確認の意味でNSPcomを用いています。(シリアルポートもあるんですができれば前者でやりたい) 機器の設定は何度も確認して間違いはないと思われます。(windowsXP使用)プログラムは以下です。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '<RS232C constant> STX = "02" EOT = "04" ENQ = "05" '伝送キャラクタ設定 ACK = "06" NAK = "15" ETX = "03" RTN = "0A" Comport = 1 OP = "9600,n,8,1" 'baud rate,stop bit,data bit,parity ADD = "01" 'RS232Cアドレス BC = "\" & EOT & ADD 'EOT+ADD Call ATH(BC) 'アスキー変換サブルーチンです。 EOTADD = BCH または (MSComm.CommPort = 1 'RS-232Cポート番号 MSComm.PortOpen = True MSComm.Settings = "9600,n,8,1" MSComm.RThreshold = 1 MSComm.SThreshold = 1 MSComm.RTSEnable = False MSComm.InputMode = MSCommLib.InputModeConstants.comInputModeBinary) End Sub この後、クリックイベント ret = Me.NspCom.ComOpen(Comport, OP) If ret = -1 Then MsgBox("miss") End If または (MSComm.PortOpen = true) でオープンさせたいのですが… 機器のHPにもサンプルプログラムもなく困っています。助言&ご指摘お願いします。

  • RS232Cによる定電圧・定電流直流電源ZXシリーズの制御方法

    VB2005によるTAKASAGOのZX-800Lの操作を行いたいのですがRS232Cのポートオープンができません。 MSCommかNspComを用いて何とかしたいのですがどうしたらいいでしょうか??現在のプログラムと設定が以下のものです。 Comport = 1,OP="9600,1,8,1",機器アドレス="01" MSComm.CommPort = 1 'RS-232Cポート番号 MSComm.Settings = "9600,n,8,1" Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click ret = Me.NspCom.ComOpen(Comport, OP) If ret = False Then MsgBox("ポートのオープンに失敗しました") End If End Sub もしくわ、MSComm.PortOpen = TrueをNspComの代わりに入れるかといったところなのですが…[HRESULTからの例外0x800A1F45]というエラーが出たりして通信できません。ポートオープンでき通信できるとZX-800LのREMOTEランプが点灯するはずなのですが点灯せず行き詰っています。アドバイス、解決方法、例になるプログラムありましたら教えてください。 ※拙い文章で申し訳ありません。補足等必要でしたら聞いてください。

  • シリアル通信:オフライン時にうまく終了してくれません

    シリアルプリンタの制御をVB6で行っております。 以下のようなコードですが、うまく終了してくれません。 'グローバル 'プリンタの状態 Dim BUF as String '起動時 Private Sub Form_Load() MSComm1.PortOpen = True Text1.Text = "" Timer1.Enabled = True End Sub '終了 Private Sub Form_Unload(Cancel As Integer) Timer1.Enabled = False MSComm1.PortOpen = False End Sub 'タイマー Private Sub Timer1_Timer() Timer1.Enabled = False Call CheckPrint Timer1.Enabled = True End Sub Private Sub MSComm1_OnComm() Dim TimeOut As Long Dim sTime As Long Dim eTime As Long Select Case MSComm1.CommEvent '受信 Case comEvReceive TimeOut = 100 sTime = timeGetTime Do If (TimeOut - eTime) < 0 Then Exit Do End If eTime = (timeGetTime - sTime) Loop Until MSComm1.InBufferCount >= 82 BUF = MSComm1.Input End Select End Sub プリンタの状態チェック Private Sub CheckPrint() Dim sTime As Long Dim eTime As Long Dim TimeOut As Long Dim i As Integer Dim n As Integer BUF = "" 'プリンタの情報取得コマンド MSComm1.Output = "~HS" 'タイマ開始 TimeOut = 400 sTime = timeGetTime eTime = 0 Do DoEvents If BUF <> "" Then Exit Do End If eTime = (timeGetTime - sTime) Loop Until TimeOut - eTime < 0 If BUF <> "" Then ... .. 宜しくお願いします。