• ベストアンサー

機器と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バイトと認識していないのでしょうか? クロスケーブルやポートに間違いはありません。 送信データ自体に問題があるような、、、。 何か私自身大きな勘違いをしているようなきはするのですが、具体的にどうなおしたらいいのかわかりません。どなたかおわかりになる方おいででしたらご教授お願いします。

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

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

通信の諸条件があっているとしたら、 lpBuffer に "FF 03 00 00 00 00 00 ~ 00 00 00 00 FF" を "\xFF\x03\x00\x00\x00\x00\x00 ~ \x00\x00\x00\x00\xFF" と、\xなんとか の形にしてみてください。 これで、バイナリの文字列が作れます。 ただし、\x00 は、C言語では、'\0' とみなされることがありますので、「なんでもいい」のでしたら、\x00 は避けて、\x01 とか、他のデータにしてみることをお勧めします。

anan23
質問者

お礼

ありがとうございました。 結局ハードに問題があったみたいです。 送信データは "\xFF\x03\x00\x00\x00\x00\x00 ~ \x00\x00\x00\x00\xFF" を採用させていただきました。 通信テストは結局あいまいにおわってしまいましたが、とても勉強になりました。 まことに理想的な回答で助かりました。 お休みのところありがとうございました。

その他の回答 (6)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.7

バイナリデータでなく文字列を送っているようですね。 #5の補足にあるように、 cBinary[0] = 0xFF の形が正解です。 あと、105byteですから最後は cBinary[104] = 0xFF です。 それとやはり結線を確認する必要もあると思います。 通常RS232Cで接続するようなものはストレートです。 簡単に言えば、パソコンと周辺機器(例えばモデム)をつなぐためのもので通常はストレート、パソコン同士をつなぐ場合は本来の用途から外れる結線なのでクロスとなります。 Ethernetでストレート、クロスを使う場合と同じですね。 その機器がパソコンに相当する場合はクロスになりますが。 専用のケーブルなら大丈夫かも知れませんが、初めてのテストなら当然ケーブルの結線ミスで失敗している可能性もありえます(経験有り)。 あと通信条件もビット長、パリティ、ソフトフロー制御、ハードフロー制御等の条件も一致させる必要があります。 それと、送るデータが正しくても相手がきちんと動いていない可能性も当然あるわけですよね。 この場合「何の反応もありません」を結果にするしかなさそうですね。 まあ、いくつかのパターンのデータで実行するぐらいはしたほうがいいでしょうけど、データフォーマット等の仕様がわからないとねぇ。

anan23
質問者

お礼

>cBinary[0] = 0xFF >の形が正解です。 これで自身がもてました。 結局通信テストはあいまいに終わってしまいましたがとても勉強になりました。 お休みのところありがとうございました。 感謝です!!

  • g_vikke
  • ベストアンサー率16% (15/90)
回答No.5

助言としては、 バイナリで送れといわれているのに 「という”文字列”を入れて送信しました。」 はないでしょう。 まぁ表現の間違いで、ほんとにバイナリで送っているのかもしれませんが。 >"FF 03 00 00 00 00 00 ~ 00 00 00 00 FF"が送られてきました。 受信したんですよね?この時点で、通信がまともに できているので、仕事は完了してると思いますよ。 それ以上は上司も望んでないことだし、 もう盆休みにしましょう(^^)

anan23
質問者

補足

みなさんお休みのところごめんなさい。 ほかに聞くあてもなくて ( p_q) よろしくおねがいします!! >「という”文字列”を入れて送信しました。」 >はないでしょう。 はい。おそらく文字列そのまま送ってると思います。 うすうすここがおかしいかな、、。とは思っていたのですが具体的にどうすればよいのかわからなくて。 受信確認はPCとPCをつないで送受信しただけなので、 PC1で"FF 03 00 00 00 00 00 ~ 00 00 00 00 FF" を送って PC2で"FF 03 00 00 00 00 00 ~ 00 00 00 00 FF" を受け取る これでPC1からの送信が確認できたのでPCと機器をつなぎPC1→機器へ "FF 03 00 00 00 00 00 ~ 00 00 00 00 FF" を送りました。 反応ありませんでした。 ん? これはバイナリで送ったとは表現しない? もしかして iLen = 0; for( i = 0 ; i < lstrlen( cBinary ) ; i++ ) { if( cBinary[i] == '0' ) iBuf[iLen++] = 0; if( cBinary[i] == '1' ) iBuf[iLen++] = 1; if( cBinary[i] == '2' ) iBuf[iLen++] = 2; if( cBinary[i] == '3' ) iBuf[iLen++] = 3; if( cBinary[i] == '4' ) iBuf[iLen++] = 4; if( cBinary[i] == '5' ) iBuf[iLen++] = 5; if( cBinary[i] == '6' ) iBuf[iLen++] = 6; if( cBinary[i] == '7' ) iBuf[iLen++] = 7; if( cBinary[i] == '8' ) iBuf[iLen++] = 8; if( cBinary[i] == '9' ) iBuf[iLen++] = 9; if( cBinary[i] == 'a' ) iBuf[iLen++] = 10; if( cBinary[i] == 'A' ) iBuf[iLen++] = 10; if( cBinary[i] == 'b' ) iBuf[iLen++] = 11; if( cBinary[i] == 'B' ) iBuf[iLen++] = 11; if( cBinary[i] == 'c' ) iBuf[iLen++] = 12; if( cBinary[i] == 'C' ) iBuf[iLen++] = 12; if( cBinary[i] == 'd' ) iBuf[iLen++] = 13; if( cBinary[i] == 'D' ) iBuf[iLen++] = 13; if( cBinary[i] == 'e' ) iBuf[iLen++] = 14; if( cBinary[i] == 'E' ) iBuf[iLen++] = 14; if( cBinary[i] == 'f' ) iBuf[iLen++] = 15; if( cBinary[i] == 'F' ) iBuf[iLen++] = 15; } こおゆう変換しなきゃいけないのかな? なにやらおかしな記号に変換されますよね。 この場合'F'、変換すると'■'の半角のやつ が1バイトですよね? とゆうことは計210バイト? あれこれも違うかな? cBinary[0] = 0xFF cBinary[1] = 0x03 ~ cBinary[104] = 0xFF cBinary[105] = 0xFF こうゆうこと? 今ちょっと手元に機器がないのですぐ確認ができないもので。 なにか思い当たる節があれば教えてください。 お願いします。

  • Pesuko
  • ベストアンサー率30% (2017/6702)
回答No.4

ボーレート・ストップビット等は合っている前提ですよね。 制御系の機器の場合、単純クロスでは動作しない物がたくさんあります。 (自滅させないといけないとか・接続してはいけないとか) ピンアサイン・ピン接続方法もわかっている前提ですか?

anan23
質問者

補足

んん? はい。ボーレート・ストップビット等は合っていると思います。念のため色々変えて送っても見ました。 >制御系の機器の場合、単純クロスでは動作しない物がたくさんあります。 >(自滅させないといけないとか・接続してはいけないとか) >ピンアサイン・ピン接続方法もわかっている前提ですか? すみません現時点では私には理解不のです。 用意されたクロスケーブルを使っています。 この辺から調べ始めると、、、。

  • g_vikke
  • ベストアンサー率16% (15/90)
回答No.3

いったい何のテストになるんですかね? 何でもいいわけはありません。 大体バイナリかアスキーかもわからない。 機械相手ならI/Fの仕様書がある筈で それにそってテストしないと 意味がないです。

anan23
質問者

補足

仕様書はバージョンが違うみたいであってないようなものです。古い機器の為。 今更カスタマイズです。 私は上司に 「FF 03 始まりの FF 終わりのデータ105バイトをバイナリで送ってみて、何か反応(エラー反応等)があるから。 とりあえず機器がデータ受け取ってるかどうか確認したいだけだから。テストしといて」 といいはなち、上司はお盆休みに入りました。 連絡もつかず。一人で四苦八苦です。 私も入ったばかりの新人で知識足らずなんですが、、、。 現状はこんなとこです。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

テストを頼んだ側に同じ質問をしてみましたか?

anan23
質問者

補足

現在お盆休みで連絡がつきません。 何とか 「FF 03 始まりの FF 終わりのデータ105バイトをバイナリで送ってみて、何か反応(エラー反応等)があるから。」 を信じてあれこれやってみてたんですが何の反応もなく、お手上げ状態になってしまいここを利用させていただきました。 よろしくお願いします。

回答No.1

Windows系で開発されているなら まず一度、ハイパーターミナルを使って 確認してみては?

関連するQ&A

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

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

  • ストレートケーブルとクロスケーブルの違いについて。

    LANケーブルであるストレートケーブルとクロスケーブルの使用用途について調べたところ、以下のような状況で使用することが分かりました。 クロスケーブル パソコン同士で一対一で接続する。 ストレートケーブル 延長ケーブル ■ストレートケーブルを使用する必要がある例 ・パソコンのLANポートと、HUBやルーターのLANポートを接続 ・ハブの通常ポートともう一つのハブのカスケードポートを接続 ・無線LANアクセスポイントとハブの通常ポートを接続 ■クロスケーブルを使用する必要がある例 ・パソコンのLANポート同士、LANアダプタ対LANアダプタを接続 ・ハブの通常ポート同士を接続 ・ハブのカスケードポート同士を接続 ・パソコンのLANポートと無線LANアクセスポイントを接続 ここで素朴な疑問なのですが、なぜストレートケーブルとクロスケーブルに分かれているのでしょうか? 機器の仕様だからという理由じゃなくて、納得のできる理由がほしいです。2種類のケーブルじゃなくて1種類のケーブルにしたほうが業務面でも効率がいいと個人的には思うのですが・・・・。 よろしくお願い致します。

  • クロスケーブルを使って、古いPCのデータを新しいPCに移したかったのですが

    どうも上手く行きません。OSは両方ともWinXPなので 「ファイルと設定の転送ウィザード」で行おうとしたのですが、 両PCのLANポートにクロスケーブルで繋げ、 画面上のウィザードを進めていくと、転送方法のダイアログボックスに 直接ケーブルという選択枠があります。 でも(シリアルポートに接続するケーブル)と書かれているんです。 LANってシリアルポート、COMポートではないですよね?? でも「ケーブル」という表示があるのはこの選択枠だけなので 仕方なく選択し実行したのですが、30分以上経っても 全く反応がありません。 でも転送方法の手順としては、間違ってはいないのでしょうか? 何十分も待つ必要があるのでしょうか? もし他によい方法があれば教えて下さい。よろしくお願いします。

  • 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 です。 なにかヒントになることがありましたら、どうぞよろしくお願いします。

  • LANのクロスケーブル

    昔は「HUBとHUB → クロスケーブル」「パソコンとパソコン → クロスケーブル」「HUBとパソコン → ストレートケーブル」など使い分けする必要がありました。 現在では各機器に自動判別機能(AutoMDI/MDI-X)があるため、ストレートケーブルで統一することが主流となっています。 これは、下記の場合ストレートケーブルでつながるんでしょうか? 1)自動判別機能のない古いPCのLANポートと自動判別機能のある新しいPCのLANポート 2)自動判別機能のない古いPCのLANポートと新しいPCではLANポートが無いのでUSB-LAN変換ケーブルを通す場合 さらに 2)の場合、LANポートが無い新しいPC、USB-LAN変換ケーブルのどちらに自動判別機能が必要なのか?

  • LANケーブルを使って2台のパソコンどうしでデータのやりとりをしたい

    LANケーブルを使って、パソコン同士でデータのやり取りをしたいのですが、どうやったらできるのでしょうか?ただ、LANケーブルでつなぐだけでできるのでしょうか?それとも、ほかに必要なものがあるのでしょうか?LANケーブルはクロスとストレート、どちらじゃないとだめとかあるのでしょうか?2台のパソコンはOSはXPとMEで、どちらも、LANポートがついています。  教えてください。よろしくお願いします。

  • RS-232Cのシュミレーターを探しています。

    ある機器(A)と機器(B)がRS-232Cケーブルでつながれているのですが、 機器Aから出力された情報を不正な電文に変更し、機器Bに送りつけるというテストを考えています。 PCで使用できるシュミレーターで 機器Aとシュミレーター用PCをRS-232Cケーブルで接続、 (1)機器Aから受けた電文を取得 その後RS-232Cケーブルを機器BとPCにつなぎ変え、 (2)取得した電文を編集して機器B送信 ということを行えるシュミレーターはないものでしょうか。 当方RS-232Cには全く詳しくないため、 わかりやすい、手っ取り早くテストできる方法を探しています。 また、そんなテスト方法はできない、 こうすればできるなどのご意見あれば教えてください。 よろしくお願いいたします。

  • USBからRS232Cに変換するケーブルを教えて…

    USBからRS232Cに変換するケーブルを教えて下さい。 最近のパソコンとマシニングセンターの RS232Cのポートをつなぎたいのです。 送信ソフトからMCにデータを送るためです。 USBからRS232Cに変換するケーブルで 通信において特にエラーがでなかったなど、  おすすめのやつがあったら教えて頂けないでしょうか? よろしければ、売っているとこなども教えて頂けると 助かります。  よろしくお願いします。

  • VBでRS232Cの制御について。

    通信のデータ長やパリティ、ポーレート等の設定を”SETTINGS”でおこない、ポートをオープンして外部機器にデータを送る際、ここでは、データをバイナリデータで送らなければなりません。 STX,アドレス,チェックサム,ETXの順にそれぞれアスキーコードで16進数に変換して送ってますが、うまく通信できません。 教えて頂けませんか。 素人でごめんなさい。 この部分のサンプルプログラムがあれば最高なんですが・・・。

  • RS232C シリアル通信用ケーブルについて

    現在、測定器とノートパソコンをRS232Cケーブルで繋ぎ、データ通信を行おうとしていますが 知識が全く無く、準備段階でつまづいています。 分からないなりに自分で調べたところ、測定器側のピン配列(ピンアサイン?)がDTEの配列で メスの25ピンになっている為、クロスケーブルの9ピン(オス)-25ピン(メス) を使うところまでは分かったのですが、 測定器のデータ送信方式が「非同期半2重通信」と書いてある場合に、ケーブルの種類は特殊なものになりますか? ”非同期式対応”と書かれたケーブルと書かれていないものがあった為、分からなくなりました。 他にRS232Cケーブルを使う際に注意しておく点、おすすめのケーブル等があれば、ご教授ください。