C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: バイナリィデータ


(過去ログ 56 を表示中)

[トピック内 27 記事 (1 - 20 表示)]  << 0 | 1 >>

■31277 / inTopicNo.1)  バイナリィデータ
  
□投稿者/ たけし (8回)-(2009/01/19(Mon) 21:00:25)

分類:[C#] 

いつもお世話になっています。


オシロスコープと通信し、FFTデータを取得しようとしています。

現在使用しているオシロスコープでは、演算結果がCH2に出て、それをバイナリィデータで取得しなければなりません。



バイナリィデータ(ブロックデータ)の構造は、

まず最初の2バイト #n でブロックデータであることを示しており、 数値 n はこの2バイトの後に続く 
nバイトの数値が、受け取るべきバイト数を 10進数で表現しています。
  nバイトのあとが、必要なバイナリィデータになります。
  受け取るべきバイナリィ数は、この10進数の値+1 になります。DLがターミネータを付けて
  送ってくるからです。



  応答メッセージの書式
   ・#n <n桁の10進数><データバイトの並び>

   ・#n
<ブロックデータ>であることを表します。

   ・<n桁の10進数>
   データのバイト数を表します。(0010=10バイト)

   ・<データバイトの並び>
   実際のデータを表します。(ABCDEFGHIJ)

   ・データは8ビットでとる得る値(0〜255)です。



   プログラムの例  #40010ABCDEFGHIJ
  
  i) ターミネータを EOI に変更
  ii) ":WAVEFORM:SEND?"を送信
  iii) まず、2バイト受信し、後ろ1バイトの数を判断(ここでは4)
  iv) 次に 4バイト受信する、必要な受信バイト数が判明(ここでは0010で10バイト)
  v) 10+1=11バイトを受信する。(ABCDEFGHIJターミネータ)
  vi) これで受信終了
  vii) ターミネータを LF+EOI に戻す
  viii)10バイト分を、2バイトずつ、変換計算式で計算して、データに変換する。
   
  という手順になります。  




作成するプログラムは次のようなものです。


@最初に演算データすべてを受信する。

A情報ヘッダを切り分けて、2バイトずつ計算処理する




@はbyte型で受信してみて、データをすべて受信することが出来ました。

しかし、このあと、Byteデータをどう処理していいのかが、わかりません。




ヘッダを読み取る作業はFFTの演算範囲を設定することで、無視できるかもしれませんが、2バイトずつを数値に直すというところはさっぱりです。


お忙しいと思いますが何かありましたらよろしくお願い致します。
引用返信 編集キー/
■31279 / inTopicNo.2)  Re[1]: バイナリィデータ
□投稿者/ まさる (49回)-(2009/01/19(Mon) 23:26:48)
まさる さんの Web サイト
#こういった方面は詳しくはありませんので、一般論で回答します。

受信したデータをByte型の配列なりListなりに入れて、2バイト分ずつ処理する形に持っていけないですかね?
引用返信 編集キー/
■31281 / inTopicNo.3)  Re[2]: バイナリィデータ
□投稿者/ たけし (9回)-(2009/01/20(Tue) 00:05:30)
No31279 (まさる さん) に返信
> #こういった方面は詳しくはありませんので、一般論で回答します。
>
> 受信したデータをByte型の配列なりListなりに入れて、2バイト分ずつ処理する形に持っていけないですかね?



返信ありがとうございます!

その方針で考えてみましたが、2バイトのバイナリィデータを数字として認識する方法がわかりませんでした。
引用返信 編集キー/
■31285 / inTopicNo.4)  Re[3]: バイナリィデータ
□投稿者/ あ (39回)-(2009/01/20(Tue) 00:39:05)
とりあえず「Byte 数値 変換」でググってみたらこんなん出たけど
http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html
引用返信 編集キー/
■31286 / inTopicNo.5)  Re[3]: バイナリィデータ
□投稿者/ 通りすがり (43回)-(2009/01/20(Tue) 00:39:35)
> 2バイトのバイナリィデータを数字として認識する方法がわかりませんでした。
これは,
> viii)10バイト分を、2バイトずつ、変換計算式で計算して、データに変換する。
のことかと思います.

例「#40010ABCDEFGHIJ」の「ABCDEFGHIJ」がデータだと思うので,2byteずつならば
 AB
 CD
 EF
 GH
 IJ
ということでしょうか?
ABCD...の部分は,実際にはどういうデータが来るのかがよくわかりませんでした.

引用返信 編集キー/
■31287 / inTopicNo.6)  Re[4]: バイナリィデータ
□投稿者/ Azulean (269回)-(2009/01/20(Tue) 01:17:28)
No31285 (あ さん) に返信
> とりあえず「Byte 数値 変換」でググってみたらこんなん出たけど
> http://www.atmarkit.co.jp/fdotnet/dotnettips/045getbytes/getbytes.html
というよりはこっちの可能性も。
http://www.atmarkit.co.jp/fdotnet/dotnettips/011byte2str/byte2str.html

Stringにしてから、int.TryParseとかに食わせれば、"0010"の説明はできるかな?
"#4"の部分は右側1文字取り出すなり、Stringに変換する範囲を調整するなりでなんとでもなるかな。(通信仕様次第)


# ところで、バイナリデータというよりは、文字列といった方が分かりやすいデータなんじゃないの?
# 文字列もバイナリかもしれないけど。
引用返信 編集キー/
■31288 / inTopicNo.7)  Re[5]: バイナリィデータ
□投稿者/ Azulean (270回)-(2009/01/20(Tue) 01:21:09)
実データ部分は2バイトずつshort型にするんですかね?
であれば、下記のコード断片をうまく活用すればいけるんでしょうか。


byte[] buffer = {65, 66};
short value = BitConverter.ToInt16(buffer, 0); // valueが得たい値?
Console.WriteLine("value = {0}", value);

引用返信 編集キー/
■31289 / inTopicNo.8)  Re[1]: バイナリィデータ
□投稿者/ オショウ (77回)-(2009/01/20(Tue) 09:06:26)
>   受け取るべきバイナリィ数は、この10進数の値+1 になります。DLがターミネータを付けて
>   送ってくるからです。

  なんか以前もどこかでこの手のものにレスしましたが・・・
  DLって、横河のデジタルオシロ?

  であれば、
  ttp://www.yokogawa.co.jp/tm/Bu/DLs/dls_soft.htm

  シリアル通信のサンプル(VB6)もありますし・・・
  DLとPC間でやろとりするユーティリティもありますし・・・

  参考までに。

以上。
引用返信 編集キー/
■31290 / inTopicNo.9)  Re[1]: バイナリィデータ
□投稿者/ .SHO (542回)-(2009/01/20(Tue) 09:19:42)
No31277 (たけし さん) に返信

>    ・データは8ビットでとる得る値(0〜255)です。

8ビットなら、データは1バイトでは?

>   iv) 次に 4バイト受信する、必要な受信バイト数が判明(ここでは0010で10バイト)

FFTの結果が10バイトって・・・そんな狭いFFTするんですか??
ホントに10進なんでしょうか?
リトルエンディアンで、4096バイトじゃないですかね?

引用返信 編集キー/
■31486 / inTopicNo.10)  Re[2]: バイナリィデータ
□投稿者/ たけし (10回)-(2009/01/22(Thu) 17:58:56)
みなさまご丁寧にお返事ありがとうございます。



オシロはDLを使っています。
その解説は企業の人に問い合わせたら返ってきた返事です。
サンプルプログラムでは、取り込んだ後の処理は載っているのですが、取り込み処理がC#とは異なっていてわからなかったので、質問させていただきました。


わかりづらくて申し訳なかったのですが、最初の「#40010」は文字列(1文字2バイト)で受信し、「ABCDEFGHIJ」は2バイト「AB」「CD」「EF」「GH」「IJ」のようにひとつのカッコごとに一つの数値データとなる仕様となっています。

もちろんこれは例なので、実際は2015バイトの受信が必要となりましたので、実際に受信する文字列は「#42002」だったのでは…と予想しています。(文字列12バイト+2002バイト+ターミネータ)

通信手段の仕様として、全てを文字列で受信する、又は、全てをバイト配列で受信しなければなりません。

そのため、文字列で受信した場合、エラーが起きてしまいます。




あ様、 Azuleanにご指摘いただいた「ToInt16」を使って数値にすることは出来ました。

今はまだ切り離す作業が出来ていないので、全てを2バイトずつ数字にしてしみたところ、FFTの演算結果とはかけ離れたものになってしまったように思われます。(真ん中に山の演算結果なのに、全体にノイズみたいになってしまった。)

これから最初の文字列を除去し、バイナリーデータから換算しますが、出来ないような気がしてなりません。




そこで、C#を用いてFFT、もしくは離散フーリエ変換などを行ったことのある方、いらっしゃいますか?

自力でやろうかと思ったのですが、C#には複素数が見当たらなく、スタートラインにたつことすら出来ませんでした。
引用返信 編集キー/
■31487 / inTopicNo.11)  Re[3]: バイナリィデータ
□投稿者/ επιστημη (1572回)-(2009/01/22(Thu) 18:05:26)
επιστημη さんの Web サイト
> そこで、C#を用いてFFT、もしくは離散フーリエ変換などを行ったことのある方、いらっしゃいますか?

やったことはないけどみたことはある。
http://www.vector.co.jp/soft/winnt/prog/se425724.html

引用返信 編集キー/
■31488 / inTopicNo.12)  Re[4]: バイナリィデータ
□投稿者/ .SHO (551回)-(2009/01/22(Thu) 19:01:23)
( byte[0] << 8 ) | byte[1] じゃ、ダメなんですか???
引用返信 編集キー/
■31501 / inTopicNo.13)  Re[4]: バイナリィデータ
□投稿者/ たけし (11回)-(2009/01/22(Thu) 23:25:47)
No31487 (επιστημη さん) に返信
>>そこで、C#を用いてFFT、もしくは離散フーリエ変換などを行ったことのある方、いらっしゃいますか?
>
> やったことはないけどみたことはある。
> http://www.vector.co.jp/soft/winnt/prog/se425724.html
>



ありがとうございます!自作のdll関数ですね!
使い方がちょっと難しそうですが…
取り込みと並行してやってみたいと思います。


引用返信 編集キー/
■31502 / inTopicNo.14)  Re[5]: バイナリィデータ
□投稿者/ たけし (12回)-(2009/01/22(Thu) 23:32:20)
No31488 (.SHO さん) に返信
> ( byte[0] << 8 ) | byte[1] じゃ、ダメなんですか???



ちょっと悩みますね…
2つの数字で8を超えるようになると思うので駄目だと思うのですが…
引用返信 編集キー/
■31503 / inTopicNo.15)  Re[5]: バイナリィデータ
□投稿者/ たけし (13回)-(2009/01/22(Thu) 23:43:55)
どうしても演算データを取ることが出来ません。
企業の人に問い合わせたところ可能とのことでしたが…

作成したプログラムを載せますのでよかったら見てください;
     


            byte[] buffer2 = new byte[100000]; //機器からデータを受信する
            byte[] buffer = new byte[100000]; //機器からデータを受信する
            string bufferdata = "";


            for (int ia = 10; 2 * ia < 2011; ia++)
            {
                buffer[ia-10] = BitConverter.ToInt16(buffer2,ia);  
            }
            string bufferdata = "";
            StreamWriter address = new StreamWriter(@"C:\結果\" + ".txt");
            {
                for (ia = 0; ia <= 1000; ia++)
                {
                    bufferdata += buffer[ia] * vdv / div + ofs + "\r\n";//DL4000系での換算係数

                }
                address.WriteLine(bufferdata);
            }

            address.Close();

引用返信 編集キー/
■31511 / inTopicNo.16)  Re[6]: バイナリィデータ
□投稿者/ 通りすがり (45回)-(2009/01/23(Fri) 01:36:08)
2009/01/23(Fri) 01:38:18 編集(投稿者)

No31503 (たけし さん) に返信

>最初の「#40010」は文字列(1文字2バイト)で受信し
1文字2バイトということは,ここは6文字あるので12byte(UTF-16など?).

>「ABCDEFGHIJ」は2バイト「AB」「CD」「EF」「GH」「IJ」
ここから先は,1文字1バイトの受信データで,2文字(16進数)で1バイトですか?

> buffer[ia-10] = BitConverter.ToInt16(buffer2,ia);
buffer2は受信データそのまま(文字列)ではなく,バイナリデータになってるんですよね.
例:0x31 0x41 0x30 0x35→ 0x1a 0x05
引用返信 編集キー/
■31519 / inTopicNo.17)  Re[6]: バイナリィデータ
□投稿者/ .SHO (552回)-(2009/01/23(Fri) 10:02:03)
No31502 (たけし さん) に返信

> 2つの数字で8を超えるようになると思うので駄目だと思うのですが…

演算結果って、2バイトで8以下なんですか???
引用返信 編集キー/
■31521 / inTopicNo.18)  Re[7]: バイナリィデータ
□投稿者/ επιστημη (1573回)-(2009/01/23(Fri) 11:15:04)
επιστημη さんの Web サイト
> わかりづらくて申し訳なかったのですが、最初の「#40010」は文字列(1文字2バイト)で受信し、
> 「ABCDEFGHIJ」は2バイト「AB」「CD」「EF」「GH」「IJ」のようにひとつのカッコごとに一つの数値データとなる仕様となっています。

- 16進表記で2文字を使って1byte(0..255)を表す

ですか? それとも

- バイナリ2byteを使って1word(0..65535)を表す

ですか?

受信されるデータは全て"読める文字"(英文字+数字)ですか? ならば前者ですね。

引用返信 編集キー/
■31533 / inTopicNo.19)  Re[7]: バイナリィデータ
□投稿者/ .SHO (553回)-(2009/01/23(Fri) 13:30:52)
8以下って、8ビット以下ってことか。

「- 16進表記で2文字を使って1byte(0..255)を表す」っぽいですね。
でも、「GH」「IJ」って・・・

buffer2 に受信はできてるみたいなので、そのデータをそのまま
掲示してくれた方が話は早いんだけどねぇ。。
引用返信 編集キー/
■31594 / inTopicNo.20)  Re[8]: バイナリィデータ
 
□投稿者/ たけし (14回)-(2009/01/24(Sat) 18:58:19)
2009/01/24(Sat) 19:39:48 編集(投稿者)
2009/01/24(Sat) 19:23:06 編集(投稿者)

<pre><pre> byte[] buffer2 = new byte[100000];// 読み込みデータ
oshirodevice.Write("WAVEFORM:SEND?" + "\n");
buffer2 = oshirodevice.ReadByteArray(10000);


デバッグを途中で止めた際にbuffer2に格納されているもの

[0]35
[1]52
[2]50
[3]48
[4]48
[5]52
[6]83
[7]0
[8]179
[9]255
[10]131
[11]255
[12]91
[13]0
[14]119
[15]0
[16]17
[17]255
[18]181
[19]14
[20]187


このようになっています。
[20]以下は同じようなデータが繰り返されるので省かせていただきます。
[2011]まで数値が入っていました。

1001点を演算した結果です。
</pre></pre>


おそらく、[0]〜[5]に#42002という文字列が入り、

[6][7]で一つのデータ…というふうになると思います。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -