• ベストアンサー

RS232Cでバイナリーデータを送信する方法を教えてください。

VBの初心者です。 RS232Cでバイナリーデータを送信したくVBでAPIを使いプログラムを組みたいと思っております。 色々な本を探してASCIIデータを送信するプログラムは発見し、改造を試みているのですが、WriteFile()ではどうしても&H81や&HF0と言ったデータが&H00に化けてしまいうまく送れません。 どなたか参考になる情報があれば教えて下さい。 よろしくお願い致します。

  • onken
  • お礼率82% (39/47)

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

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

APIでなきゃだめでしょうか? VBならMSCOMMを使ってバイナリデータの送信が簡単に出来ます。 Dim bytBuffer() as byte Redim bytBuffer(255) as Byte for i=0 to 255 __bytBuffer(i) = i Next i MSComm1.Output = bytBuffer てな感じです。

onken
質問者

補足

早速の回答ありがとうございます。 APIにこだわる必要はありませんのでこの方向で結構だとおもいます。 さっそく試して見た所、MSComm1.Output = bytBufferの所で”実行エラーオブジェクトがありません”となりました。 申し訳ありませんがもう少しMSCOMMの使い方を教えて頂けないでしょうか? よろしくお願い致します。

その他の回答 (1)

回答No.2

>さっそく試して見た所、MSComm1.Output = bytBufferの所で >”実行エラーオブジェクトがありません”となりました。 フォームにMSCOMMを張りつけてますか? 「プロジェクト」→「コンポーネント」→「Microsoft Comm Control」をチェックし ツールボックスの電話アイコンのコントロールを張りつけます。

onken
質問者

お礼

回答ありがとうございます。 ActiveXを勉強していなかったので初歩的な質問をしてしまいました。 アドバイスの通りコンポーネントをフォームに貼り付ける事によりバイナリーデーターの送信に成功しました。 本当にありがとうございます。

関連するQ&A

  • RS-232Cでバイナリデータを受信する方法

    2台のPCを使用しバイナリファイルをRS232Cを使用し1台目のPCは送信専用、2台目のPCは受信専用で、送信側のPCから出したデータを受信側PCでデータの内容を判断し集計するプログラムを作ろうとしています。 送信側のPCでは、"AAB9AAC2AACC01D8AAE2・・・”といった内容のバイナリファイルの内容を1バイトずつ読み込み、それをMsCommを用いてバイナリモードで送信させて、EOFになるまで永遠とそれを繰り返します。 問題は受信側で、たとえば上記のデータの中の"AAB9"ならばカウントを1つ上げる、"AACC01D8"ならばカウントを1つ下げ、それを表示するといったような処理をリアルタイムで行いたいのですが、どうしてもデータの取りこぼしが発生します。 また、データの意味合いとしては、必ず"AA"という1バイトのデータから始まり、それに1バイトから5バイトまでのデータが可変長で付いてきて次の"AA"までが1つの意味となります。 通信パラメータは9600、8ビット、ストップビット1、パリティなしで、その他の制御線は一切使用しないという条件です(要するにRxD、GND線のみの最低限の条件) 受信側のバッファは1024バイトで、MSComm1.RThreshold = 1でOnCommを発生させています。また、送信側のファイルの大きさは1kバイトほどです 正直なところ、このようなことが可能なのかどうかもわからない状況なのですが、現状ではデータを数バイト取りこぼしているだけのようなのでできないことはないのではないか?と考えています。 どなたか、参考文献、ホームページ、プログラム、考え方等を何でもかまいませんん!ぜひ、ご教授願います!!また、現在はVBにて開発中ですが、最悪、言語は問いません。よろしくお願いいたします。

  • XPでVBを使いRS232Cから5bpsでデータを出力する方法を教えて下さい。

    VBの初心者です。 VBを使いRS2322Cから5bpsでデータを出力したいと思っています。 98MEにてAPIのWriteFile()を使い成功したのですが、XPへ移行したとたんNGとなってしまいました。 MSComm1.Outputを使おうかとも思ったのですが最低ボーレイト110bpsまでで使えません。 何方かXPでRS2322Cから5bpsでデータを出力する方法をご存知の方がおられれば教えて下さい。

  • VBで16進数をバイナリ変換しRS232通信

    VB CommunityでRS232C通信プログラムを作成しています。 OKWaveをみて、ポート接続などはできたのですが、 データ送信でつまづいてます。 16進数をバイナリ変換し送信したいのです。 その部分ですが、16進数で[11]をバイナリに変換して送信したい場合、 Dim command(0) As Byte command(0) = &H11 SerialPort1.Write(command, 0, 1) としても、16進数で[11]を送ったときの動作を行いません。。 VectorなどでのRS232通信テストツールでは反応あるのですが。。 初歩的ですみませんが、よろしくお願いします。

  • バイナリファイル

    VBでバイナリファイルを読み込み、処理しようとしているのですが、VBではバイナリファイルを扱えないのでしょうか? APIしかないのでしょうか? 例) バイナリデータ:10(16進) 取扱データ:16(10進) 上記のことをしたいのですが、うまく扱えません。 CDecも"&H10"なら16として扱えるのですが、バイナリデータをそのまま数値化することができません。 何か良い方法があれば教えて下さい。

  • シリアル通信プログラミングでのバイナリデータ送信

    UNIX系環境(IRIX)でのシリアル通信プログラムを作成していて、 バイナリデータの送信方法がわからず困っています。 write関数を使い、テキストデータの送信は出来ます。 write(fd,"テキスト",byte)のように。 ただ、今回はバイナリデータ送信を考えており、 例えば1byteのデータ00000001(01H)を送りたいと思っています。 このデータを送る場合、write関数で実現出来るのでしょうか? write(fd,0x01,1)←イメージです。 色々ネットで調べても出てきません。 開発がWindows環境ではないので、API関数が使えない状況で困っています(MsComm等が使えない)。また、fwrite関数は使用してはいけないみたいです。教えてください。宜しくお願いします。

  • VB2005でWin32APIを用いてRS-232CのRTS信号を、デ

    VB2005でWin32APIを用いてRS-232CのRTS信号を、データ送信中だけHIGHにさせるプログラムを作成中です。 色々調べて、Win32APIを使うことで、それらしい動作をさせるプログラムを作れることが分かり、色々調べてコーディングしたのですが、上手く動きません…。処理の流れは以下のようになっています。 (1) CreateFile()関数でCOMを開く。   (CreateFile()の「フラグ」には"FILE_FLAG_OVERLAPPED"を指定) (2) CreateEvent()関数にてイベントオブジェクトを作成。 (3) EscapeCommFunction()でRTS信号をHIGHに設定。 (4) WriteFile()関数でRS-232Cへデータを送信する。 ※ここまでは、オシロスコープにて正しく動作していることを確認しています。 (5) データ送信完了を待つために、SetCommEvent()関数で"EV_TXEMPTY"イベントマスクをセット。 (6) WaitCommEvent()で送信完了を待つ。   ⇒WaitCommEvent()関数が、データ送信完了を待たずに抜けてきてしまう(Falseがリターンされる)…。 (7) そこで、WaitForSingleObject()を使ってイベントハンドラが"シグナル状態"になるのを待つ。   ⇒タイムアウトに"INFINITE"を指定すると、無限待ち状態に陥ってしまう。   ⇒また、タイムアウトに"1000"を指定すると、約1秒後に"WAIT_TIMEOUT"が返ってきてしまう。 WriteFile()関数、そしてWaitCommEvent()関数の引数には、OVERLAPPED構造体へのポインタを渡しているのですが、思うように動いてくれません。 ※Win32APIの関数宣言の記述方法(データ型など)が誤って、このようになっていたりするのでしょうか… どなたかヒントでもお教えいただけると、大変助かります。 以上、よろしくお願いいたします。

  • バイナリデータの書き方が分かりません・・。

    シリアルポートでバイナリデータを送信したいのですが、バイナリをどう書けがいいのか分りません。 送りたいコードは16進数で02 00 02 00です。 以下のソースの"123"の部分を書き換えるのだと思うのですが、どう書けば良いのでしょうか? よろしくお願いします。 char* wbuf; DWORD wbyte; lstrcpy(wbuf,"123"); WriteFile(hCom,wbuf,lstrlen(wbuf),&wbyte,&old

  • Win32APIのWriteFile()でRS-232Cポートにデータ

    Win32APIのWriteFile()でRS-232Cポートにデータを送信出来ません。 WriteFile()実行後、GetLastError()でエラーコードを確認したところ、6を返していました。 このエラーは、 6 ERROR_INVALID_HANDLE 6 0x00000006 ハンドルが無効です なので、指定したハンドル番号が無効だからエラーが出るようなのですが、実際にはCreateFile()が返したハンドル番号を指定していますので、なぜこのエラーが出るのか分かりません。 環境は、VMWare 5.5 + Windows 2000 + Visual Basic 6.0 です。 なにかヒントになることがありましたら、どうぞよろしくお願いします。

  • RS-232C通信(その1)

    RS-232Cの通信が上手くいかず困っています。 ユニットはオムロンV600コントローラと三菱シリアルコミュニケーションユニットです。 コントローラ取説を参考にケーブルを製作しましたが自信がありません。 正誤について指摘ください。 <コントローラ取説記載> コントローラ側⇔上位機器 GR 1─シールド   FG SG 9──────SG SD 2──────RD RD 3──────SD RS 4─┐  ┌─RS CS 5─┘  └─CS <製作したケーブル> コントローラ側⇔通信ユニット(A1SJ71QC24N-R2) GR 1─シールド SG 9──────SG 5 SD 2──────RD 2 RD 3──────SD 3 RS 4─┐  ┌─RS 7 CS 5─┘  └─CS 8 ┌─DTR 4 └─DSR 6 接続なしCD 1 宜しくお願いいたします。 背景ですが、現在、設備にV600を設置しておりVBでのプログラムを使い通信しております。 今回、V600を増設する、PCを集約化するなどの理由により、PLCから通信することになったのです。 (過去もPLCから通信しようとしたのですが、出来なくてPCにしてしまいました) そこで困っているのは、A1SJ71で”オーバーラン・フレーミングエラー”が出てしまいます。 データの送り方、受け方が解らないのです。 やりたいのは、 ”アドレス”0010”にアスキーで”070119”を送信したい”です。 コマンドデータは、”WTA10010070119” WT:コマンド A:アスキー 1:ヘッドチャンネル 0100:アドレス 070119:データ 質問1:”CR”はどう付加(表記)すればいいのでしょうか。 プログラムは下記のとおりです。 転送指令 ├─┤├─┬──(MOV K2 D100) A1SJ71のCH2を指定しD100へ │    ├──(MOV K7 D101) データ長7ワード │    ├──($MOV "WTA10010070119" D104) 送信データをD104(CR必要ですがわからない) │    └──(SET M○○) データ転送セット │ 送信指令 ├─┤├────(G.OUTPUT UA D100 D104 M○□)UAは先頭アドレスがXA0から始まる 質問2:間違い教えてください。 以上、宜しくお願いいたします。 ごちゃごちゃして申し訳ありません。 もしかして、”無手順送信用ユーザー登録フレーム”のアドレス”B7H”・”157H”終了コード(CR/LF)の指定をすればいいのですか。 このバッファメモリの変更の仕方がわかりません‥。 バッファメモリの書き替えは、 ”TO”命令で出来そうです。 やってみて、問題がありましたら、(その2)にて質問させていただきます。 また、結果も記載します。

  • 機器とRS232Cクロスケーブルでのデータのやり取りについて

    現在仕事で、組み込み系のシステム開発をしております。今回、私が作ったシステムではないのですが通信のテストを頼まれました。内容は RS232Cのクロスケーブルで よくわかりませんが何らかの機器を制御する機械と 接続。 FF 03 ~ FF で終わる105バイトの バイナリデータを送信すると機器が何らかの(LEDがついたり)反応がある。 とのことでした。 ~の部分は何でもいいようです。 VC++にて「WriteFile」を使い BOOL WriteFile( HANDLE hFile,  // シリアルポートへのハンドラ LPCVOID lpBuffer,// 送信バッファへのポインタ DWORD nNumberOfBytesToWrite, // 送信データ数 LPDWORD lpNumberOfBytesWritten,// 実際に送信したデータ数 LPOVERLAPPED lpOverlapped  // 非同期I/O動作の場合のオーバーラップ構造体へのポインタ ); この関数の lpBuffer に "FF 03 00 00 00 00 00 ~ 00 00 00 00 FF" という文字列を入れて送信しました。 テストでパソコン同士を232Cクロスケーブルでつなぎ 送信したろころたしかに "FF 03 00 00 00 00 00 ~ 00 00 00 00 FF" が送られてきました。 しかしこれを機器に送信しても何の反応もありません。??? "FF030000000000 ~ 00000000FF" これもダメでした。 この場合"FF"をバイナリの1バイトと認識していないのでしょうか? クロスケーブルやポートに間違いはありません。 送信データ自体に問題があるような、、、。 何か私自身大きな勘違いをしているようなきはするのですが、具体的にどうなおしたらいいのかわかりません。どなたかおわかりになる方おいででしたらご教授お願いします。

専門家に質問してみよう