• ベストアンサー

機器と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