計測制御技術ラウンジ >> GPIB技術ラウンジ 全部 1- 最新50

VC でバイナリデータ取得する方法

1 名前: 小高俊 投稿日:2004/08/25(水) 19:56 ID:qIaxmCmE
どなたか,どうか助けてください.
Interface社製PCI4301のGPIBで,小野測器CF8400(FFTアナライザ)からデータを
取得したいのですが,昔の計測器でバイナリ出力しかできず,大苦戦しています.
言語はC です.M'sさんの書き込みも参考になりましたが,うまくできません.
バイナリは01の羅列で来るのでしょうか?
バイナリの知識も無いので,困っています.
どなたかアドバイスをお願いします.

2 名前: 匿名488 投稿日:2004/08/26(木) 07:42 ID:???
CF8400 については、詳しい方に譲るとして、バイナリデータ一般について
説明しますと、GPIB バス上の転送に限って言えば、いわゆるアスキーデータ
(=人間が読める数値などのキャラクタ文字列での転送)と同じで、
特にモードに区別があるわけではありません。

下記で説明するように、データエンドを自動認識する都合上、API 自体バイナリ、
アスキーに分かれている場合もありますが、ほとんどの API では、
格納先はどちらも unsigned char[] (あるいは byte 型として確保した
メモリのポインタ)になるはずです。

バイナリデータの場合、アスキーデータと取り扱いが異なるのは2点ありまして、

1)使用するキャラクタの範囲がアスキーデータの場合のように
  いわゆる alpha-numeric('A-Z','0-9','+/-' 等) に限定できない、
  ため、CR(0x0D) や LF(0x0A) をデータのエンドマークとして使えません。
  したがって、
  a)常にデータのレコード長を決めた転送をする
  b)データの先頭など、固定位置に転送データ数(バイト数)を埋め込んで、
   受信側でデータ区切り(転送終了)を知る
  c)GPIB バスに備わっている EOI 信号線を用いて、データライン外で
   データ区切り(転送終了)を通知する
  などの方法をとることになります。

  上記のどれを使用する必要があるのかについては、API と
  計測器の仕様によりますので、マニュアルをご覧ください。
 
2)アスキーデータの場合は、1)でも説明しましたように
可読文字列(簡単なデジボル等で説明しますと) '+1.345E3' 等の
データ(unsigned char[],あるいは char[])として戻ってくるため、
見た目から取り扱いが想定できますが、バイナリデータの場合、
フォーマットがあらかじめ固定(仕様で)されていて、
しかも計測器によってまちまちなため、一概になんとも言えません。

よって説明のしようがないのですが、あくまでも「仮定の仕様」の一例で説明しますと、
'+1.345E3' を返す仕様を考えますと、

「仮定仕様」
有効数字4桁、指数部1桁、固定データ、4バイト長

1バイト目:符号 (0x00:+ , 0xFF:- , その他:エラーコード)
2バイト目:有効数字上位2桁 Packed BCD (上位4bit,下位4bit がそれぞれ 10 進数値)
3バイト目:有効数字下位2桁 Packed BCD
4バイト目:上位 4bit:指数部符号 , 下位 4bit:指数部1桁

等が想定され(実際の計測器の場合、マニュアルに記述があるはずです)

API から取得したデータは、以下のように返されることが考えられます。

unsigned char result[] = { 0x00 , 0x13 , 0x45 , 0x03 } 

返されたデータの処理は、上記の仕様にしたがって実数型や文字列等に
「自分で変換」することになるのが一般的です。

参考になりますでしょうか。

3 名前: 小高俊 投稿日:2004/08/27(金) 21:32 ID:/TCVNFsI
匿名488殿
親切な説明本当にありがとうございます.
おかげさまで,理解できてきた気がします.
2バイト16ビットの2の補数形式で転送されます.
それで,short int RecvBuf[1]; で,バッファRecvBuf
に入れて,データ点数が1024点なので,
for文で繰り返し読み込んでみました.すると,数値に置き換わって
見えました.あとは,測定値への換算だと思っています.
それで,データ点数が多いので,ファイルに書き込んで,
確認をしたいのですが,今度は書き込みがうまくいきません.
これはVC++の話になるんだと思います.
FILE *fp;
fp = fopen("test.txt","w");
for (i = 1; i<=1024; i++){
 nRet = PciGpibExMastRecvData(BoardNo,.....);
 fprintf(fp, "No.%-5d%d\n", i, RecvBuf[0]);
}
 fclose(fp);
で,test.txtファイルは作成できるんですが,中身に
データが書き出せないのです.(空のファイル)
こんな基本的なことをお聞きするのは申し訳ないのですが,
甘えさせていtだきまして,アドバイスいただけると嬉しいです.
データを全部見てみないと,計測データが取り出せたのか
不安なもので,なんとか見なくてはと思っています.
現在はVC++の統合環境下でデバックモードで確認しています.
御手数をおかけしますが,どうぞよろしくお願いします.

4 名前: 匿名488 投稿日:2004/08/27(金) 23:57 ID:???
>>3
一般論ですが、fclose() を実行して、
プログラムを終了したあとでも、中身は空ですか?

fclose() する前(ステップ実行中など)で、
バッファリングさているデータがファイルに書かれる前、
ということはないですか?

5 名前: 小高俊 投稿日:2004/08/29(日) 23:42 ID:1oRSASlI
匿名488殿
うまくいきました!!
計測器からデータを取得することができました.
アドバイス本当に有り難うございました.
なんとお礼を言って良いのやら...です.
やっとすっきり夏休みに入れます!!
どうも有り難うございました.

新着レスの表示

名前 : E-mail(省略可) :

文責:計測制御技術ラウンジ, Powered by ©タカヒロ@みちのく掲示板 [12ch BBS 2.03]