Fóruns: VC++公開討議 (Thread #31569)

インテルHEXファイル内の値のステータスの一部分だけ表示させるだけのプログラムを作りたい。 (2012-02-18 10:07 by blackzoro #62276)

現在、VC++の勉強をしてます。このプロジェクトCC1101で使用しているATmega88のEEPROM内容には、電波出力時にそれぞれの基板に誤差が生じるため、これを補正するための加算減算情報や各温度補正情報を入れています。

これをテスト時に確認したい時があります。ATmega88のEEPROMをPCで読み込んでファイルを見ればそれで済むことは済むのですが、もう少し、このファイルの特定のバイトデータのみを表示できればもっとこの作業も楽になるのではと考えています。



例えばなのですが、このHEXファイルを読み込んで、特定の番地の複数データを変数に格納しておいて、それだけをメッセージボックスなどで表示して確認できるようなプログラムを作りたいと思っています。

この前トゥイーさんに作成して頂いた

Intelhexutil.exeのソースコードを一部改造して、これを作ることはできないかと考えています。


ちゃんとした仕様書描いてみようと思っています。

もし良ければどなたか御指導頂けると幸いです。

Responder a #62276×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: インテルHEXファイル内の値のステータスの一部分だけ表示させるだけのプログラムを作りたい。 (2012-02-18 10:48 by blackzoro #62277)

(ATmegaのインテルHEXファイルの中身)eeprom_data_sn02006.hex

:1000000021800000062980FFFFFFFFFFFFFFFFFFA9
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFDFFFCFFFCFFFCFFFD7C
:1001A000FFFDFFFFFF000001000200030004000547
:1001B000000500FFFFFFFFFFFFFFFFFFFFFFFFFF47
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:00000001FF



このテキストで書かれたファイルをintelhexutil.exeにドロップすると



int main(int argc, char** argv) {


IntelHEXFilePtr file(get_file(argc, argv));
ofstream out("output.hex");

if (out) {
for (IntelHEXFile::const_iterator i = file->begin(); i != file->end(); ++i) {
const IntelHEXRecordPtr& record = *i;
out << record->record() << endl;
}
}

return 0;
}





このプログラム IntelHEXFilePtr file(get_file(argc, argv));で、読み込まれ、recodeという行にそれぞれ1行ずつストックされてそれが、チェックサム計算された結果が33行分ストックされるような動作をすることは何となくわかりました。


その後、for分で33回ループして、out.txtというファイルに1行ずつ書き込んで行っているようですね。


今回のプログラムではこの1行目の

:1000000021800000062980FFFFFFFFFFFFFFFFFFA9


これの10文字目の”21”--->adj_freq変数に格納したい
12文字目の”80”---->freq_add_sub
14~19文字目の”00”,”00”,”06”---->serial[0],serial[1],serial[2]
20文字目の”29”---->adj_temper
22文字目の”80”---->temper_add_sub



このようにそれぞれの変数に表示するようにしたいのです。


格納したら、テキストファイル出力で、


adj_freq = 21
freq_add_sub = 80
serial = 000006
adj_temper = 29
temper_add_sub= 80


このように表示してもらえると、作業が楽になるなと考えてるんです。
もう少し追加とか修正とか後で書きます。


Responder a #62276

Responder a #62277×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: インテルHEXファイル内の値のステータスの一部分だけ表示させるだけのプログラムを作りたい。 (2012-02-18 23:15 by toy_dev #62288)

どうもトゥイーです。

気軽に色々と聞いてくださって大丈夫ですよ^^;

内容はこれから見るので、僕が読んで理解している間に追記をしてくださっても全然大丈夫です。

見てますよということで一度返信しておきます。
Responder a #62277

Responder a #62288×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: インテルHEXファイル内の値のステータスの一部分だけ表示させるだけのプログラムを作りたい。 (2012-02-21 07:46 by toy_dev #62341)

■対応方法

まずは main.cpp のファイル出力部分を以下のように修正すれば目的を達成できると思います。

if (out) {
for (IntelHEXFile::const_iterator i = file->begin(); i != file->end(); ++i) {
const IntelHEXRecordPtr& record = *i;
if (record->type() == "00" && record->data().length() == 32) {
out << "address = " << record->address() << endl;
out << "adj_freq = " << record->data().substr( 0, 2) << endl;
out << "freq_add_sub = " << record->data().substr( 2, 2) << endl;
out << "serial = " << record->data().substr( 4, 6) << endl;
out << "adj_temper = " << record->data().substr(10, 2) << endl;
out << "temper_add_sub = " << record->data().substr(12, 2) << endl;
out << endl;
}
}
}

■解説

以下、解説です。

HEX ファイルの各行は以下の要素からなります。

・データ長(length)
・アドレス(address)
・レコードタイプ(type)
・データ(data)
・チェックサム(checksum)

IntelHEXRecord は、各行をそれぞれの要素に分割してアクセスできるようにします。
record->record() はレコード全体を表すもので、
それでも目的はもちろん達成できますが、それぞれの要素にアクセスする方が楽です。
今回の場合は、データ部にアクセスしたいので record->data() を使います。
そして、substr で必要な要素を切り出して出力します。

別に record->data() ではなく record->record() でももちろんOKです。

最初のプログラムの誤りは、括弧が足りないことです^^;

○ record->record()
× record->record

たったコレだけなんですけどね。

■質問

adj_freq, freq_add_sub, serial, adj_temper, temper_add_sub は
本プロジェクト独自のデータフォーマットですよね?
Responder a #62277

Responder a #62341×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: インテルHEXファイル内の値のステータスの一部分だけ表示させるだけのプログラムを作りたい。 (2012-02-20 16:22 by blackzoro #62332)

トゥイーさん

いつもお世話になっております。今回トゥイーさんに作って頂いたプログラムを改造していろいろと試しているのですが、VC++の理解などいろいろと難しいと感じております。

もし良ければご教授頂けますと幸いです。


例えば、IntelHEXRecordのプログラムのmain部分で、

for分が33回ループするということで、1回のループで1行分のテキストデータを出力ファイルに書き込んでいると思うのですが、
i==0の時に

:1000000021800000062980FFFFFFFFFFFFFFFFFFA9

このテキストデータがrecordというstringに入っているので、この10文字目を2つのテキストデータ”0x21”をadj_freqという変数に代入することはできないでしょうか?


このようなプログラムを作って見たのですが、エラーがでて先に行けない状態です。
解決方法などご教授頂けないでしょうか。


if (out) {
for (IntelHEXFile::const_iterator i = file->begin(); i != file->end(); ++i) {
const IntelHEXRecordPtr& record = *i;
out << record->record() << endl;

if(i==0)
{
adj_freq = record->record.substr(10, 2).c_str();
//freq_add_sub
}

}
}



どうぞよろしくお願いします。

Responder a #62276

Responder a #62332×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login