• 検索結果がありません。

9. プロジェクト「msd_fat11_38a」 microSD にデータ記録(FAT32 版)

9.6 プログラムの解説

9.6.3 main 関数(FAT32 でマウント)

69 : /* FAT32

でマウント */

70 : if( ret == 0x00 ) {

71 : ret = mountMicroSD_FAT32();

72 : if( ret != 0x00 ) { 0

以外ならエラー

73 : printf( "\n" );

74 : printf( "microSD

FAT32

のフォーマットではありません。\n" );

75 : printf( "FAT32

でフォーマットしてください。\n" );

76 : printf( "(Error Code = %d)\n", ret );

77 : pattern = 99;

78 : } else {

79 : printf( "\n" );

80 : printf( "microSD

FAT32

フォーマットです。\n" );

81 : }

82 : }

83 :

87 : if( i == -1 ) { -1

なら以外ならエラー

88 : printf( "microSD

から書き込み番号が読めません。\n" );

89 : ret = 1;

90 : pattern = 99;

91 : } else { 92 : i++;

93 : if( i >= 10000 ) i = 1;

94 : writeMicroSDNumber( i ); /* microSD

の空き領域へ番号書き込み */

95 :

96 : /* ファイル名変換 */

97 : sprintf( fileName, "test%04d.csv", i ); ファイル名変換 98 : }

99 : } 100 :

101 : /* ファイル名のセット、領域確保 */

102 : if( ret == 0x00 ) {

103 : /* ファイルのタイムスタンプセット */

104 : setDateStamp( getCompileYear( C_DATE ),

105 : getCompileMonth( C_DATE ), getCompileDay( C_DATE ) );

106 : setTimeStamp( getCompileHour( C_TIME ),

107 : getCompilerMinute( C_TIME), getCompilerSecond( C_TIME ) );

108 :

109 : /* ファイル名の確認 */

110 : printf( "ファイルを開いて、領域の確保中です。

:" );

111 : for( i=0; fileName[i]!='\0'; i++ ) printf( "%c", fileName[i] );

112 : printf( "\n" );

113 :

114 : /* ファイル名のセット、領域確保 */

115 : /* 書き込みしたい時間[ms] : x = 10[ms] : 23

バイト(保存バイト数) */

116 : /* 10000ms(10

秒)なら、x = 10000 * 23 / 10 = 23000 */

117 : /* 結果は 512

の倍数になるように繰り上げする。 */

118 : /* また、最初のメッセージ分として+512

しておく */

119 : ret = writeFile( fileName, 23552 );

120 : if( ret != 0x00 ) { 0

以外ならエラー

121 : printf( "ファイルが開けません。(Error Code = %d)\n", ret );

122 : pattern = 99;

123 : } else {

124 : printf( "ファイルを開きました。\n" );

125 : printf( "\n" );

126 :

127 : /* microSD

書き込み */

128 : msdPrintf( "msd_fat11_38a Log Data\n" );

129 : while( checkMsdPrintf() ); // msdPrintf

処理完了待ち

130 : msdPrintf( "Compile Date:" );

131 : while( checkMsdPrintf() ); // msdPrintf

処理完了待ち

132 : msdPrintf( C_DATE );

133 : while( checkMsdPrintf() ); // msdPrintf

処理完了待ち

134 : msdPrintf( " Time:" );

135 : while( checkMsdPrintf() ); // msdPrintf

処理完了待ち

136 : msdPrintf( C_TIME );

137 : while( checkMsdPrintf() ); // msdPrintf

処理完了待ち

138 : msdPrintf( "\n\nLineNo,ポート 0,ディップスイッチ\n" );

139 : while( checkMsdPrintf() ); // msdPrintf

処理完了待ち

140 : }

141 : }

9.

プロジェクト「msd_fat11_38a」

microSD

にデータ記録(FAT32版)

70

行目

82

行目

mountMicroSD_FAT32

関数で、microSDから

FAT32

情報を読み込みます。

microSDがFAT32以外でフォーマットされている場合はエラーになります。Windowsなどで、FAT

32

でフォーマットしてください。

85

行目

99

行目

ファイル名を連番にするために、前回書き込んだ番号を読み込み、今回の番号を保存します。

86

行の

readMicroSDNumber

関数で、microSDの空き領域から前回書き込んだファイル番号を読み

込みます。

92

行で

1

つ大きい値にして、今回のファイル名の番号にします。

94

行の

writeMicroSDNumber

関数で、次に備えて今回の番号を保存しておきます。

97

行目で

fileName

配列にファイル名を設定します。今回は「test0000.csv」で、「0000」部分の数

字が、書き込むたびに増えていきます。ファイル名を変えたい場合はここで変えますが、ファイル名 の長さは、8文字以内+ピリオド+拡張子3文字以内にしてください。

104

行目

107

行目

microSD

にファイルとして書き込むとき、マイコンはカレンダー情報を持っていません。そのため、ビ

ルドしたときの日付、時刻を、microSDへ書き込むファイルの日付、時刻とします。

setDateStamp

関数で、年月日を設定します。年月日情報が保存されている

C_DATE

配列は、文字

列として情報を持っているので、これらを

int

型に変換する関数で変換して設定しています。

setTimeStamp

関数で、時分秒を設定します。時分秒情報が保存されている

C_TIME

配列は、文字

列として情報を持っているので、これらを

int

型に変換する関数で変換して設定しています。

110

行目

112

行目

microSD

に書き込むファイル名を

printf

文で通信ソフトに表示しています。書き込むファイル名の確

認用なので、この部分は無くても構いません。

115

行目

126

行目

119

行の

writeFile

関数で、microSDに保存するファイル名と書き込む容量を指定して、FAT32領域

を確保します。

今回、データの記録条件を次のようにしました。

・データ記録の間隔 … 10msごと

・データ記録数 ……… 23バイト (内容は後述します)

・データ記録時間 …… 10秒(10000ms)

microSD

に確保する容量は、次のようになります。

容量=記録したい時間[ms]÷記録する間隔[ms]×1回に記録するバイト数 よって、容量は次のとおりです。

=10000÷10×23 =23000

値は、512の倍数にしなければいけません。512の倍数かどうか確かめます。

23000÷512=44

余り

472

割り切れないので、512の倍数で切り上げます。また、最初に分かりやすいようにコメントを書くので その分を加えます。100文字くらいですが、最小単位は

512

なので、512を加えます。よって、

512×45+512=23552

となります。

ファイル名は、fileName配列に設定しているので、この配列名を

writeFile

関数の引数にします。

writeFile

関数の戻り値が

0

なら、microSDにファイル名の登録、容量の確保が完了です。0以外な

らエラーとなります。

128

行目

書き込むファイルの最初に、ビルドしたときの日付、時間、書き込む列の内容を書き込みます。

microSD

への書き込みには

msdPrintf

文を使います(詳しくは後述します)。

msdPrintf文で書き込んだ後、次に書き込むには、①最大時間の10ms待つ ②checkMsdPrintf 関数で書き込みが終わったか確認する の二通りの方法があります。今回は、②で確認します。