お世話になっております。
使用しているMCU:RX113
RSPIで接続された富士通製FRAM(MB85RS512T)へのデータ書き込みについて、ご教示お願いします。
※ バイト単位でのデータの読み書き、ステータスレジスタの読み込み等はできております。
● 実現したいこと。
カンマで区切られた幾つかのデータをテキストで読める形で書き込むこと。
上記の理由・目的:メモリに蓄積されたデータを外部に送信して、読めること。
● 考えてみたコード (抜粋)
unsigned char Memout[] = ""; unsigned char *Memdata[9];
Memdata[0] = "20170428 11:12" ","; // 日付・時刻 14Byte Memdata[1] = " 12" ","; // 冷凍機 作動電流値 3Byte Memdata[2] = "2.7" ","; // 扉ヒーター 作動電流値 3Byte Memdata[3] = "0.8" ","; // ドレンヒーター 作動電流値 3Byte Memdata[4] = "-17.3" ","; // 庫内温度 5Byte Memdata[5] = "12345" ","; // 電源ON連続時間 5Byte Memdata[6] = "11:12" ","; // 温度異常時時刻 5Byte Memdata[7] = " 85.7" ","; // 温度異常時の温度 5Byte Memdata[8] = "5" "\r\n"; // 扉開閉回数 1Byte
/* データ送信関数への引渡し */
data_send(Memdata); // メモリへの書き込みデータ送信
※ 上に書きましたコードの初期値は、記憶領域を計算するための覚え書き程度のものです。
● 確認したいこと
0番目から8番目までのデータは、それぞれ決まった長さ(上記のコードのバイト数)で揃えたいが、この場合
sprintf(Memdata[n], "%4d,", data ); // <- 第2項の最後に、カンマが入っています。
という記述で問題はおきないものかどうか。? ということです。
お手数をおかけして大変恐縮ですが、何卒よろしくおねがいします。
わわい様
わかりにくい質問で申し訳ありません。
メモリへの記録イメージを図にしてみました。
0番目から9番目のデータを一組としてメモリに書き込むのですが、データの区切りとしてカンマ「,」を入れます。
ご指摘いただきましたとおり、配列では文字列の最後に'\0'(NULL)が入りますので、各要素は1バイトずつ増えるとして、メモリに送るデータは
【例】
char *Memdata[9];
char delimiter = ',';
sprintf(Memdata[0], "%d %s", data1, delimiter);
sprintf(Memdata[1],"%d%s", data2, delimiter);
/* ・・・・・・・・(中略)・・・・・・・・・ */
sprintf(Memdata[8],"%d%s", data9, delimiter);
senddata(Memdata);
と、このような記述で問題は発生しないかどうか、ということを確認したいのです。
おそらく、もっとスマートな記述方法があると思うのですが・・・
ご教示よろしくお願いします。
十分な大きさの Memdata[] を定義した上で
sprintf(Memdata,"%4d%2d%2d %2d:%2d\r\n", year, month, day, hour, minute);
とすれば 年4桁月2桁日2桁 時2桁:分2桁\r\n\0 の文字列が得られます。項目を増やしたければ sprintf() の第2引数を変更し、minute 以降の引数を追加するだけです。
Fujita様 お世話になっております。 ご回答ありがとうございます。 なるほど、それによって各項目毎の長さを定め、一組のデータをつくることができますね。 そうしますと、配列としては今回の「一組のデータ」の最後に付くCRLFの後に1つのNULLがつくわけですね。
デリミタである「,」(カンマ)は、変数の一つとしておいたほうがよいものでしょうか、それとも第2引数に記述したほうが間違いが発生しないものなのかどうか…
明示してもあまり意味がないならば、第2引数に記述したほうがよいような気もしますが、いかがでしょうか。
> 第2引数がかなり長くなるわけですが、ダブルクォーテーションの途中で改行する方法はあるものでしょうか。
連続する文字列定数は連結されるので
sprintf(Memdata, "%4d%2d%2d %2d:%2d\r\n", year, month, day, hour, minute);
は
sprintf( Memdata, "%4d" "%2d" "%2d" " " "%2d" ":" "%2d" "\r\n", year, month, day, hour, minute );
と書くこともできます。