EEPROMのデータをSDカードにコピーし,バイナリデータからテキストデータに変換するプログラム.SDカードスロットの接続が必要.SDカードにあらかじめformat.txtが必要.
Dependencies: mbed SDFileSystem EEPROM_lib
main.cpp
00001 #include "mbed.h" 00002 #include "SDFileSystem.h" 00003 #include "EEPROM_lib.h" 00004 00005 Serial pc(USBTX, USBRX, 115200); 00006 I2C i2c_bus(p28, p27); 00007 00008 EEPROM_lib EEPROM(i2c_bus, 4); 00009 SDFileSystem sd(p5, p6, p7, p8, "sd"); 00010 00011 const int DATA_INT = 1, DATA_FLOAT = 2, DATA_DOUBLE = 3, DATA_BOOL = 4, DATA_CHAR = 5, DATA_SHORT = 6, DATA_LONGLONG = 7; 00012 00013 FILE *file_bin, *file_format, *file_out; 00014 00015 int main() { 00016 wait(1.0f); 00017 00018 //プログラムの説明 00019 pc.printf("\r\n"); 00020 pc.printf("EEPROM's Binary Data Encode for Text Data\r\n"); 00021 pc.printf("Please Input 'D' (large D) to Start : "); 00022 while(1){ 00023 if(pc.getc() == 'D'){ 00024 pc.printf("START\r\n\n"); 00025 break; 00026 } 00027 } 00028 00029 //フォーマットファイルの探索 00030 printf("Searching file [format.txt] in SD...\r\n"); 00031 file_format = fopen("/sd/format.txt", "r"); 00032 if(file_format == NULL){ 00033 pc.printf("[format.txt] not found.\r\n"); 00034 pc.printf("Please Add file [format.txt] in SD\r\n"); 00035 while(1); 00036 } 00037 else{ 00038 pc.printf("[format.txt] OK!!\r\n"); 00039 } 00040 00041 00042 //フォーマットファイルの読み取り 00043 char data_line[16], data_format[16]; 00044 int format_length[128], format_length_n = 0; 00045 00046 pc.printf("Read [format.txt].\r\n"); 00047 while(fgets(data_line, 16, file_format) != NULL){ 00048 sscanf(data_line, "%s", data_format); 00049 if(strcmp(data_format, "int") == 0){ 00050 format_length[format_length_n++] = DATA_INT; 00051 pc.printf("%d : int\r\n", format_length_n - 1); 00052 } 00053 else if(strcmp(data_format, "float") == 0){ 00054 format_length[format_length_n++] = DATA_FLOAT; 00055 pc.printf("%d : float\r\n", format_length_n - 1); 00056 } 00057 else if(strcmp(data_format, "double") == 0){ 00058 format_length[format_length_n++] = DATA_DOUBLE; 00059 pc.printf("%d : double\r\n", format_length_n - 1); 00060 } 00061 else if(strcmp(data_format, "bool") == 0){ 00062 format_length[format_length_n++] = DATA_BOOL; 00063 pc.printf("%d : bool\r\n", format_length_n - 1); 00064 } 00065 else if(strcmp(data_format, "short") == 0){ 00066 format_length[format_length_n++] = DATA_SHORT; 00067 pc.printf("%d : short\r\n", format_length_n - 1); 00068 } 00069 else if(strcmp(data_format, "longlong") == 0){ 00070 format_length[format_length_n++] = DATA_LONGLONG; 00071 pc.printf("%d : long long\r\n", format_length_n - 1); 00072 } 00073 else{ 00074 pc.printf("ERROR : format error!!!!!\r\n"); 00075 } 00076 } 00077 00078 fclose(file_format); 00079 pc.printf("OK!!\r\n"); 00080 00081 00082 //EEPROMの中身をSDに移植 00083 char ADDR_H, ADDR_L; 00084 int num, block; 00085 char data_eeprom[128]; 00086 00087 ADDR_H = ADDR_L = 0x00; 00088 num = 1; 00089 block = 0; 00090 00091 file_bin = fopen("/sd/EEPROM_data.bin", "wb"); 00092 00093 pc.printf("Data Copy [EEPROM -> SD]."); 00094 00095 for(int i = 0; i < 4096; i ++){ 00096 switch(i){ 00097 case 512: 00098 num = 1; 00099 block = 1; 00100 break; 00101 00102 case 1024: 00103 num = 2; 00104 block = 0; 00105 break; 00106 00107 case 1536: 00108 num = 2; 00109 block = 1; 00110 break; 00111 00112 case 2048: 00113 num = 3; 00114 block = 0; 00115 break; 00116 00117 case 2560: 00118 num = 3; 00119 block = 1; 00120 break; 00121 00122 case 3072: 00123 num = 4; 00124 block = 0; 00125 break; 00126 00127 case 3584: 00128 num = 4; 00129 block = 1; 00130 break; 00131 } 00132 00133 EEPROM.readMultiByte(num, block, ADDR_H, ADDR_L, data_eeprom, 128); 00134 //pc.printf("%d %01d %02x %02x\r\n", num, block, ADDR_H, ADDR_L); 00135 pc.printf("."); 00136 fwrite(data_eeprom, sizeof(char), 128, file_bin); 00137 00138 if(ADDR_L == 0x00){ 00139 ADDR_L = 0x80; 00140 } 00141 else{ 00142 ADDR_L = 0x00; 00143 ADDR_H ++; 00144 } 00145 } 00146 00147 fclose(file_bin); 00148 pc.printf("OK!!\r\n"); 00149 00150 00151 //バイナリファイルのオープン(読み取り用に) 00152 pc.printf("Binary File Open : "); 00153 file_bin = fopen("/sd/EEPROM_data.bin", "rb"); 00154 if(file_bin == NULL){ 00155 pc.printf("NG...\r\n"); 00156 pc.printf("Please Check Connection and Settings\r\n"); 00157 while(1); 00158 } 00159 else{ 00160 pc.printf("OK!!\r\n"); 00161 } 00162 00163 00164 //書き込むファイルのオープン 00165 pc.printf("Text File Open : "); 00166 file_out = fopen("/sd/EEPROM_encode_data.txt", "w"); 00167 if(file_out == NULL){ 00168 pc.printf("NG...\r\n"); 00169 pc.printf("Please Check Connection and Settings\r\n"); 00170 while(1); 00171 } 00172 else{ 00173 pc.printf("OK!!\r\n"); 00174 } 00175 00176 00177 //データ取得&テキストデータとして書き込み 00178 int data_int; 00179 float data_float; 00180 double data_double; 00181 bool data_bool; 00182 char data_char; 00183 short data_short; 00184 long long data_longlong; 00185 00186 int data_count, data_size, data_print = 0; 00187 00188 pc.printf("Data Encoding [Binary -> Text]."); 00189 00190 while(1){ 00191 for(data_count = 0; data_count < format_length_n; data_count ++){ 00192 switch(format_length[data_count]){ 00193 case DATA_INT: 00194 data_size = fread(&data_int, sizeof(int), 1, file_bin); 00195 if(data_size != 0){ 00196 fprintf(file_out, "%d\t", data_int); 00197 } 00198 break; 00199 00200 case DATA_FLOAT: 00201 data_size = fread(&data_float, sizeof(float), 1, file_bin); 00202 if(data_size != 0){ 00203 fprintf(file_out, "%f\t", data_float); 00204 } 00205 break; 00206 00207 case DATA_DOUBLE: 00208 data_size = fread(&data_double, sizeof(double), 1, file_bin); 00209 if(data_size != 0){ 00210 fprintf(file_out, "%lf\t", data_double); 00211 } 00212 break; 00213 00214 case DATA_BOOL: 00215 data_size = fread(&data_bool, sizeof(bool), 1, file_bin); 00216 if(data_size != 0){ 00217 fprintf(file_out, "%d\t", data_bool); 00218 } 00219 break; 00220 00221 case DATA_CHAR: 00222 data_size = fread(&data_char, sizeof(char), 1, file_bin); 00223 if(data_size != 0){ 00224 fprintf(file_out, "%c\t", data_char); 00225 } 00226 break; 00227 00228 case DATA_SHORT: 00229 data_size = fread(&data_short, sizeof(short), 1, file_bin); 00230 if(data_size != 0){ 00231 fprintf(file_out, "%hd\t", data_short); 00232 } 00233 break; 00234 00235 case DATA_LONGLONG: 00236 data_size = fread(&data_longlong, sizeof(long long), 1, file_bin); 00237 if(data_size != 0){ 00238 fprintf(file_out, "%lld\t", data_longlong); 00239 } 00240 break; 00241 } 00242 } 00243 00244 if(data_print ++ == 1000){ 00245 pc.printf("."); 00246 data_print = 0; 00247 } 00248 00249 fprintf(file_out, "\r\n"); 00250 if(data_size == 0){ 00251 break; 00252 } 00253 } 00254 00255 pc.printf("Complete!!\r\n"); 00256 00257 00258 //終了 00259 fclose(file_bin); 00260 fclose(file_out); 00261 00262 pc.printf("Program Finish!!\r\n"); 00263 00264 while(1) { 00265 } 00266 }
Generated on Wed Jul 13 2022 07:53:54 by 1.7.2