シリアル通信プログラミングでのバイナリデータ送信の方法とは?

このQ&Aのポイント
  • UNIX系環境(IRIX)でのシリアル通信プログラムを開発している際、バイナリデータの送信方法がわからず困っています。write関数を使えばテキストデータの送信は可能ですが、バイナリデータの送信方法について詳しく教えてください。
  • バイナリデータの具体的な例として、1byteのデータ00000001(01H)を送信したいです。この場合、write関数をどのように使用すれば良いでしょうか?ネットで検索しても情報が得られなかったため、ご教授いただけると幸いです。
  • 開発環境がWindowsではないため、API関数やfwrite関数を使用できず困っています。バイナリデータの送信にはwrite関数以外の方法があるのか、教えていただけないでしょうか?お願いします。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> write(fd,0x01,1)←イメージです。 ↑では駄目です。 write(fd,"\x01",1); または char data[] = { 0x01 }; write(fd, data, 1); とする必要があります。

redroof22
質問者

お礼

こんな簡単なことだったんですか・・・ 気づかなかった自分が情けないです。 ありがとうございました。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

RS-232Cなら、書き込まれたデータが「テキスト」か「バイナリ」かなんて判断は受信したソフトの役割です。 書き込む段階で気にすることではありません。 #てかこの程度のこと試してから聞いてくださいよ

redroof22
質問者

お礼

今回シリアル通信プログラムを作成したのが初めてで。。 すみません。プログラミングもかなり未熟なものですから。 ありがとうございました。

関連するQ&A

  • C言語のシリアル通信について

    C++でプログラムを書き、シリアル通信(RS232C)を使ってデバイスを動かしたいと試みているのですがよくわからないのでアドバイスお願いします。(OSはlinux) デバイス特有の命令を送るところがよくわかりません。(命令はキャラクタではなくバイナリで送らなければなりません。) 命令はバイナリデータです。 例、 char i[]={255,20,0,10}; ↑このようなデータです。 このようなデータを送る際はfwrite関数を使うということは調べたのですがどのように表すかわからないので教えていただきたいです。 初めのシリアルポートを開く際に”wb”をつけないといけないみたいですがどのようにつければいいのでしょうか。 fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NONBLOCK); if(fd<0) { printf("erroe\n"); exit(-1); } ↑自分が書いたポートを開く時のプログラムです。最初の行の最後に”wb"を付け足せば良いのですか。 上記の例のような命令を送るとすると fwrite(&i,sizeof(char),4,fd); return 0; で良いでしょうか。warningがでて動作しないのでアドバイスよろしくお願いします。 説明が下手で申し訳ありません。一番わからない点はシリアル通信で命令を送るときのポートオープンとfwriteを使った命令を送る形式です。どうぞよろしくお願いします。

  • シリアル通信バイナリー変換

    機器とのシリアル通信をテラタームで行っています。 この機器の入力送信モードに入るためには、テラターム上でCtrl+kを押す必要があります。 このとき、機器へはどのようなデータがおくられているのでしょうか? テラタームを使わずに送信しようとしています。そこで、キー「Ctrl」「k」をバイナリーで送信してみましたが、入力送信モードにはいることができませんでした。バイナリーでの送信は、単純に「Ctrl」「k」を順に送っているだけで、テラタームで「Ctrl+k」を押したとき送信される情報とは違っているのではと推測しています。ただそのバイナリー情報は何にあたるのかがわからないでいます。ご教授お願いします。

  • シリアル通信でのバイナリデータの送受信方法

    visual studio 2008 c++ を用いて 0x00~0xFFの任意のバイトをシリアル通信で送受信するプログラムを書いています。 0x00(NUL)を含んだ文字列は、文字列処理関数では処理出来ないので、以下のようにプラグラムを書くと文字列の最後を示すのに NULL を使っている処理系なので、文字列として読み込みをしているため,NULLで止まってしまいます。 -------------------------------------------------------- 略 DWORD dwWritten; char sendBuf[32]={0}; sendBuf[0] = 0x02; //02 STX sendBuf[1] = 0x00; //00 長 sendBuf[2] = 0xC0; //C0 取得コマンド sendBuf[3] = 0x10; //10 取得コマンド sendBuf[4] = 0x03; //03 ETX sendBuf[5] = 0xD0; //D0 Sum WriteFile(hComm, sendBuf, 6, &dwWritten, NULL); //hComm 指定ポート, 略 -------------------------------------------------------- そこで,送信データをバイナリデータとして扱う関数を使う必要があると思います。 ただ,いろいろ調べたのですが,バイナリデータとして読み書きする関数が分からず困っています。 そのため,バイナリデータとして扱う関数とその使用例を教えていただきたいです。 プログラム初心者のため,問題解決のために必要なコードや情報が不足していることがあるかと思います。 その際にはご指摘いただきたいと思います。

  • シリアル通信について

    質問です。 仕事でシリアルプリンタをMSCommで制御しています。 開発環境はVB6(SP5),XPです。 MSCommにて印字データを一度に沢山送ると情報落ち(?)した印字内容になってしまいます。多分プリンタ内のバッファ(みたいなもの)が一杯になるかして、プリンタの処理能力が限界なのかと勝手に思ったりもしています。 ちなみに10秒間隔くらいで送れば大丈夫です。 一方、シリアル通信の実験としてTera Termを使用しています。Tera Termだと一度に沢山のデータを送っても問題ないです。Tera Termはそこらへんを制御しているのでしょうか? また、MSCommにもそのようなことができるのでしょうか? よくわからない質問かもしれませんが、どんな些細なことでも結構ですのでご教授願います。

  • Arduino シリアル通信でのバイナリ受信

    詳しい方教えてください。 送信元のPCから、受信側のArduinoへ、シリアル通信によってバイナリデータを送ることで、Arduino側でのサーボモータのシリアル駆動を試みています。 PC側からのバイナリデータ送信はVB.NET側で作成済みで、USB-TTLコンバータ(FTDI Basic Breakout 5V)を使ってのサーボモータのシリアル駆動は問題ありません。 (http://micono.cocolog-nifty.com/blog/2011/04/arduino11-17d5.html と同じ処理と思ってください。) 同様な処理を、PC-Arduinoで駆動させようと思っていますが、 void loop() { int c; if (Serial.available() > 0){ c = Serial.read(); ・・・・ こちらでは、Cの値がint型の為かうまくいきません。(キャストも試しましたが・・) そもそも1バイトデータの受信Serial.read()が、int型(2バイト)なのか判りません。 方法はありますでしょうか。

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

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

  • Win32APIでシリアル通信をするには?

    Win32APIとVB.NETを使ってシリアル通信をするプログラミングを考えています。概要はGPS端末からのデータをVBで受信して表示できるようなプログラムを目指していますが、APIの使い方が分からないので詳しく教えていただける方がいましたら、サンプルソースまたは参考Webサイトの教示をお願いします。 VB6.0のクラス(MSComm)を追加する方法ではなく、APIを使う方向で回答お願いします。

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

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

  • form送信でテキストがバイナリになる

    form(post)で「&#xE63E;」というデータを送信したいのですが、 手入力で送信するとサーバ側で「&#xE63E;」のままデータを受け取ることができます。 しかし、スクリプトに直接書いて送信するとバイナリで受け取ってしまいます。 これを避けたいのですが(全てテキストで受け取りたいです) これはHTTPの仕様なんですか? もう少し具体的に書くと <input type="text" name="test" value=""> このテキストボックスに「&#xE63E;」と入力するとテキストで受け取れます。 しかし、 <input type="text" name="test" value="&#xE63E;"> これでそのまま送信するとバイナリになってしまいます。 環境 apache2 php4.0 IE6.0 よろしくお願いします。

  • 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通信テストツールでは反応あるのですが。。 初歩的ですみませんが、よろしくお願いします。

専門家に質問してみよう