Thu, Jul 20, 2000 at 08:44:42PM +0900 において
Masaki Fukushima さん曰く:

> > 測定データをCのscanfによって処理する仕様にしてしまうと、
> > 測定器が代るたびにCでプログラムを書き直さなくてはならなくなります。
> > GPIBカードに依存する部分はCで書かなくてはならないと思うのですが、
> > GPIBカードにつないだGPIB機器に依存する部分はrubyで書きたいのです。
> > # わがままでしょうか? (^^;;
> 
> あ、そうなんですか。
> そこまで読めませんでした。

 すいませんです。説明不足でした。


> > しかもこのret配列は
> > 
> >   (long int型 この後に続く要素の数)(float型データ)(float型データ)…
> > 
> > みたいな形式になることもありましてCで変換してしまうのは負けっぽいです。
> > 
> > scanfのような変換をこーイイ感じに抽象化してくれるモジュールを
> > 書くべきなんでしょうか…?
> 
> いや、データのフォーマットさえ正確に分かっていれば、多分できると思
> いますよ。
> 
> 結局、この「(float型データ)」というデータはバイナリなんですか、文字
> 列なんですか?
> 
> scanfで読めてるとすると、文字列ってことになりますけど。
> 
> だとすると、各データの区切りはどうなっているのでしょう。

 読みたいフォーマット(FORM3とか呼ぶらしい)はIEEE32ビット浮動小数点フォーマット
とかいうやつで…

  文字列"#6"
  6バイトの文字列(この後に続くデータのバイト数)
  8バイトのdoubleデータ
  8バイトのdoubleデータ
  …
  EOI

とかなってるみたいです。

  require "gpib"
  dev = Gpib.new(18) # GPIBアドレス18で初期化
  dev.write("SING?") # 掃引待ち
  sleep(9)
  dev.write("FORM3") # FORM3形式で読み出し
  dev.write("OUTPSTIM?") # 横軸(周波数)のデータを読む
  r = "" ; r << dev.read while !dev.eoi # eoi が立つまでデータ読み込み
  fary = r.unpack("aaaaaaaad*")
  fary.each{|a|
    print(a, "\n")
  }

ってなかんじのスクリプトを田鎖さんのGPIBモジュールを使って
書いてみたのですが…

  #
  6
  0
  0
  3
  2
  0
  8
  2.213181251e-312
  -7.766515835e+255
  -1.67565126e+203
  -3.816111887e+150
  -8.203543647e+97
  -1.851627386e+45
  -3.968895868e-08
  -8.89044621e-61
  -1.901112197e-113
  -4.232626747e-166
  -9.033037558e-219
  -1.92688338e-271
  1.377639377e+293
  2.933988765e+240
  6.463747383e+187
  1.374874212e+135
  4.605570485e+77
  9.895050706e+24
  …

みたいに無意味なデータしか読めないです。

-- 
Tokyo Metropolitan University     Kiwamu Okabe
 Mail: kiwamu / debian.or.jp
 URL:  http://silica.eei.metro-u.ac.jp/~kiwamu/