EEPROMのデータをSDカードにコピーし,バイナリデータからテキストデータに変換するプログラム.SDカードスロットの接続が必要.SDカードにあらかじめformat.txtが必要.

Dependencies:   mbed SDFileSystem EEPROM_lib

Committer:
Sigma884
Date:
Tue Feb 12 15:55:25 2019 +0000
Revision:
0:16243fbc2c6e
EEPROM's Binary Data encode for Text Data ver1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:16243fbc2c6e 1 #include "mbed.h"
Sigma884 0:16243fbc2c6e 2 #include "SDFileSystem.h"
Sigma884 0:16243fbc2c6e 3 #include "EEPROM_lib.h"
Sigma884 0:16243fbc2c6e 4
Sigma884 0:16243fbc2c6e 5 Serial pc(USBTX, USBRX, 115200);
Sigma884 0:16243fbc2c6e 6 I2C i2c_bus(p28, p27);
Sigma884 0:16243fbc2c6e 7
Sigma884 0:16243fbc2c6e 8 EEPROM_lib EEPROM(i2c_bus, 4);
Sigma884 0:16243fbc2c6e 9 SDFileSystem sd(p5, p6, p7, p8, "sd");
Sigma884 0:16243fbc2c6e 10
Sigma884 0:16243fbc2c6e 11 const int DATA_INT = 1, DATA_FLOAT = 2, DATA_DOUBLE = 3, DATA_BOOL = 4, DATA_CHAR = 5, DATA_SHORT = 6, DATA_LONGLONG = 7;
Sigma884 0:16243fbc2c6e 12
Sigma884 0:16243fbc2c6e 13 FILE *file_bin, *file_format, *file_out;
Sigma884 0:16243fbc2c6e 14
Sigma884 0:16243fbc2c6e 15 int main() {
Sigma884 0:16243fbc2c6e 16 wait(1.0f);
Sigma884 0:16243fbc2c6e 17
Sigma884 0:16243fbc2c6e 18 //プログラムの説明
Sigma884 0:16243fbc2c6e 19 pc.printf("\r\n");
Sigma884 0:16243fbc2c6e 20 pc.printf("EEPROM's Binary Data Encode for Text Data\r\n");
Sigma884 0:16243fbc2c6e 21 pc.printf("Please Input 'D' (large D) to Start : ");
Sigma884 0:16243fbc2c6e 22 while(1){
Sigma884 0:16243fbc2c6e 23 if(pc.getc() == 'D'){
Sigma884 0:16243fbc2c6e 24 pc.printf("START\r\n\n");
Sigma884 0:16243fbc2c6e 25 break;
Sigma884 0:16243fbc2c6e 26 }
Sigma884 0:16243fbc2c6e 27 }
Sigma884 0:16243fbc2c6e 28
Sigma884 0:16243fbc2c6e 29 //フォーマットファイルの探索
Sigma884 0:16243fbc2c6e 30 printf("Searching file [format.txt] in SD...\r\n");
Sigma884 0:16243fbc2c6e 31 file_format = fopen("/sd/format.txt", "r");
Sigma884 0:16243fbc2c6e 32 if(file_format == NULL){
Sigma884 0:16243fbc2c6e 33 pc.printf("[format.txt] not found.\r\n");
Sigma884 0:16243fbc2c6e 34 pc.printf("Please Add file [format.txt] in SD\r\n");
Sigma884 0:16243fbc2c6e 35 while(1);
Sigma884 0:16243fbc2c6e 36 }
Sigma884 0:16243fbc2c6e 37 else{
Sigma884 0:16243fbc2c6e 38 pc.printf("[format.txt] OK!!\r\n");
Sigma884 0:16243fbc2c6e 39 }
Sigma884 0:16243fbc2c6e 40
Sigma884 0:16243fbc2c6e 41
Sigma884 0:16243fbc2c6e 42 //フォーマットファイルの読み取り
Sigma884 0:16243fbc2c6e 43 char data_line[16], data_format[16];
Sigma884 0:16243fbc2c6e 44 int format_length[128], format_length_n = 0;
Sigma884 0:16243fbc2c6e 45
Sigma884 0:16243fbc2c6e 46 pc.printf("Read [format.txt].\r\n");
Sigma884 0:16243fbc2c6e 47 while(fgets(data_line, 16, file_format) != NULL){
Sigma884 0:16243fbc2c6e 48 sscanf(data_line, "%s", data_format);
Sigma884 0:16243fbc2c6e 49 if(strcmp(data_format, "int") == 0){
Sigma884 0:16243fbc2c6e 50 format_length[format_length_n++] = DATA_INT;
Sigma884 0:16243fbc2c6e 51 pc.printf("%d : int\r\n", format_length_n - 1);
Sigma884 0:16243fbc2c6e 52 }
Sigma884 0:16243fbc2c6e 53 else if(strcmp(data_format, "float") == 0){
Sigma884 0:16243fbc2c6e 54 format_length[format_length_n++] = DATA_FLOAT;
Sigma884 0:16243fbc2c6e 55 pc.printf("%d : float\r\n", format_length_n - 1);
Sigma884 0:16243fbc2c6e 56 }
Sigma884 0:16243fbc2c6e 57 else if(strcmp(data_format, "double") == 0){
Sigma884 0:16243fbc2c6e 58 format_length[format_length_n++] = DATA_DOUBLE;
Sigma884 0:16243fbc2c6e 59 pc.printf("%d : double\r\n", format_length_n - 1);
Sigma884 0:16243fbc2c6e 60 }
Sigma884 0:16243fbc2c6e 61 else if(strcmp(data_format, "bool") == 0){
Sigma884 0:16243fbc2c6e 62 format_length[format_length_n++] = DATA_BOOL;
Sigma884 0:16243fbc2c6e 63 pc.printf("%d : bool\r\n", format_length_n - 1);
Sigma884 0:16243fbc2c6e 64 }
Sigma884 0:16243fbc2c6e 65 else if(strcmp(data_format, "short") == 0){
Sigma884 0:16243fbc2c6e 66 format_length[format_length_n++] = DATA_SHORT;
Sigma884 0:16243fbc2c6e 67 pc.printf("%d : short\r\n", format_length_n - 1);
Sigma884 0:16243fbc2c6e 68 }
Sigma884 0:16243fbc2c6e 69 else if(strcmp(data_format, "longlong") == 0){
Sigma884 0:16243fbc2c6e 70 format_length[format_length_n++] = DATA_LONGLONG;
Sigma884 0:16243fbc2c6e 71 pc.printf("%d : long long\r\n", format_length_n - 1);
Sigma884 0:16243fbc2c6e 72 }
Sigma884 0:16243fbc2c6e 73 else{
Sigma884 0:16243fbc2c6e 74 pc.printf("ERROR : format error!!!!!\r\n");
Sigma884 0:16243fbc2c6e 75 }
Sigma884 0:16243fbc2c6e 76 }
Sigma884 0:16243fbc2c6e 77
Sigma884 0:16243fbc2c6e 78 fclose(file_format);
Sigma884 0:16243fbc2c6e 79 pc.printf("OK!!\r\n");
Sigma884 0:16243fbc2c6e 80
Sigma884 0:16243fbc2c6e 81
Sigma884 0:16243fbc2c6e 82 //EEPROMの中身をSDに移植
Sigma884 0:16243fbc2c6e 83 char ADDR_H, ADDR_L;
Sigma884 0:16243fbc2c6e 84 int num, block;
Sigma884 0:16243fbc2c6e 85 char data_eeprom[128];
Sigma884 0:16243fbc2c6e 86
Sigma884 0:16243fbc2c6e 87 ADDR_H = ADDR_L = 0x00;
Sigma884 0:16243fbc2c6e 88 num = 1;
Sigma884 0:16243fbc2c6e 89 block = 0;
Sigma884 0:16243fbc2c6e 90
Sigma884 0:16243fbc2c6e 91 file_bin = fopen("/sd/EEPROM_data.bin", "wb");
Sigma884 0:16243fbc2c6e 92
Sigma884 0:16243fbc2c6e 93 pc.printf("Data Copy [EEPROM -> SD].");
Sigma884 0:16243fbc2c6e 94
Sigma884 0:16243fbc2c6e 95 for(int i = 0; i < 4096; i ++){
Sigma884 0:16243fbc2c6e 96 switch(i){
Sigma884 0:16243fbc2c6e 97 case 512:
Sigma884 0:16243fbc2c6e 98 num = 1;
Sigma884 0:16243fbc2c6e 99 block = 1;
Sigma884 0:16243fbc2c6e 100 break;
Sigma884 0:16243fbc2c6e 101
Sigma884 0:16243fbc2c6e 102 case 1024:
Sigma884 0:16243fbc2c6e 103 num = 2;
Sigma884 0:16243fbc2c6e 104 block = 0;
Sigma884 0:16243fbc2c6e 105 break;
Sigma884 0:16243fbc2c6e 106
Sigma884 0:16243fbc2c6e 107 case 1536:
Sigma884 0:16243fbc2c6e 108 num = 2;
Sigma884 0:16243fbc2c6e 109 block = 1;
Sigma884 0:16243fbc2c6e 110 break;
Sigma884 0:16243fbc2c6e 111
Sigma884 0:16243fbc2c6e 112 case 2048:
Sigma884 0:16243fbc2c6e 113 num = 3;
Sigma884 0:16243fbc2c6e 114 block = 0;
Sigma884 0:16243fbc2c6e 115 break;
Sigma884 0:16243fbc2c6e 116
Sigma884 0:16243fbc2c6e 117 case 2560:
Sigma884 0:16243fbc2c6e 118 num = 3;
Sigma884 0:16243fbc2c6e 119 block = 1;
Sigma884 0:16243fbc2c6e 120 break;
Sigma884 0:16243fbc2c6e 121
Sigma884 0:16243fbc2c6e 122 case 3072:
Sigma884 0:16243fbc2c6e 123 num = 4;
Sigma884 0:16243fbc2c6e 124 block = 0;
Sigma884 0:16243fbc2c6e 125 break;
Sigma884 0:16243fbc2c6e 126
Sigma884 0:16243fbc2c6e 127 case 3584:
Sigma884 0:16243fbc2c6e 128 num = 4;
Sigma884 0:16243fbc2c6e 129 block = 1;
Sigma884 0:16243fbc2c6e 130 break;
Sigma884 0:16243fbc2c6e 131 }
Sigma884 0:16243fbc2c6e 132
Sigma884 0:16243fbc2c6e 133 EEPROM.readMultiByte(num, block, ADDR_H, ADDR_L, data_eeprom, 128);
Sigma884 0:16243fbc2c6e 134 //pc.printf("%d %01d %02x %02x\r\n", num, block, ADDR_H, ADDR_L);
Sigma884 0:16243fbc2c6e 135 pc.printf(".");
Sigma884 0:16243fbc2c6e 136 fwrite(data_eeprom, sizeof(char), 128, file_bin);
Sigma884 0:16243fbc2c6e 137
Sigma884 0:16243fbc2c6e 138 if(ADDR_L == 0x00){
Sigma884 0:16243fbc2c6e 139 ADDR_L = 0x80;
Sigma884 0:16243fbc2c6e 140 }
Sigma884 0:16243fbc2c6e 141 else{
Sigma884 0:16243fbc2c6e 142 ADDR_L = 0x00;
Sigma884 0:16243fbc2c6e 143 ADDR_H ++;
Sigma884 0:16243fbc2c6e 144 }
Sigma884 0:16243fbc2c6e 145 }
Sigma884 0:16243fbc2c6e 146
Sigma884 0:16243fbc2c6e 147 fclose(file_bin);
Sigma884 0:16243fbc2c6e 148 pc.printf("OK!!\r\n");
Sigma884 0:16243fbc2c6e 149
Sigma884 0:16243fbc2c6e 150
Sigma884 0:16243fbc2c6e 151 //バイナリファイルのオープン(読み取り用に)
Sigma884 0:16243fbc2c6e 152 pc.printf("Binary File Open : ");
Sigma884 0:16243fbc2c6e 153 file_bin = fopen("/sd/EEPROM_data.bin", "rb");
Sigma884 0:16243fbc2c6e 154 if(file_bin == NULL){
Sigma884 0:16243fbc2c6e 155 pc.printf("NG...\r\n");
Sigma884 0:16243fbc2c6e 156 pc.printf("Please Check Connection and Settings\r\n");
Sigma884 0:16243fbc2c6e 157 while(1);
Sigma884 0:16243fbc2c6e 158 }
Sigma884 0:16243fbc2c6e 159 else{
Sigma884 0:16243fbc2c6e 160 pc.printf("OK!!\r\n");
Sigma884 0:16243fbc2c6e 161 }
Sigma884 0:16243fbc2c6e 162
Sigma884 0:16243fbc2c6e 163
Sigma884 0:16243fbc2c6e 164 //書き込むファイルのオープン
Sigma884 0:16243fbc2c6e 165 pc.printf("Text File Open : ");
Sigma884 0:16243fbc2c6e 166 file_out = fopen("/sd/EEPROM_encode_data.txt", "w");
Sigma884 0:16243fbc2c6e 167 if(file_out == NULL){
Sigma884 0:16243fbc2c6e 168 pc.printf("NG...\r\n");
Sigma884 0:16243fbc2c6e 169 pc.printf("Please Check Connection and Settings\r\n");
Sigma884 0:16243fbc2c6e 170 while(1);
Sigma884 0:16243fbc2c6e 171 }
Sigma884 0:16243fbc2c6e 172 else{
Sigma884 0:16243fbc2c6e 173 pc.printf("OK!!\r\n");
Sigma884 0:16243fbc2c6e 174 }
Sigma884 0:16243fbc2c6e 175
Sigma884 0:16243fbc2c6e 176
Sigma884 0:16243fbc2c6e 177 //データ取得&テキストデータとして書き込み
Sigma884 0:16243fbc2c6e 178 int data_int;
Sigma884 0:16243fbc2c6e 179 float data_float;
Sigma884 0:16243fbc2c6e 180 double data_double;
Sigma884 0:16243fbc2c6e 181 bool data_bool;
Sigma884 0:16243fbc2c6e 182 char data_char;
Sigma884 0:16243fbc2c6e 183 short data_short;
Sigma884 0:16243fbc2c6e 184 long long data_longlong;
Sigma884 0:16243fbc2c6e 185
Sigma884 0:16243fbc2c6e 186 int data_count, data_size, data_print = 0;
Sigma884 0:16243fbc2c6e 187
Sigma884 0:16243fbc2c6e 188 pc.printf("Data Encoding [Binary -> Text].");
Sigma884 0:16243fbc2c6e 189
Sigma884 0:16243fbc2c6e 190 while(1){
Sigma884 0:16243fbc2c6e 191 for(data_count = 0; data_count < format_length_n; data_count ++){
Sigma884 0:16243fbc2c6e 192 switch(format_length[data_count]){
Sigma884 0:16243fbc2c6e 193 case DATA_INT:
Sigma884 0:16243fbc2c6e 194 data_size = fread(&data_int, sizeof(int), 1, file_bin);
Sigma884 0:16243fbc2c6e 195 if(data_size != 0){
Sigma884 0:16243fbc2c6e 196 fprintf(file_out, "%d\t", data_int);
Sigma884 0:16243fbc2c6e 197 }
Sigma884 0:16243fbc2c6e 198 break;
Sigma884 0:16243fbc2c6e 199
Sigma884 0:16243fbc2c6e 200 case DATA_FLOAT:
Sigma884 0:16243fbc2c6e 201 data_size = fread(&data_float, sizeof(float), 1, file_bin);
Sigma884 0:16243fbc2c6e 202 if(data_size != 0){
Sigma884 0:16243fbc2c6e 203 fprintf(file_out, "%f\t", data_float);
Sigma884 0:16243fbc2c6e 204 }
Sigma884 0:16243fbc2c6e 205 break;
Sigma884 0:16243fbc2c6e 206
Sigma884 0:16243fbc2c6e 207 case DATA_DOUBLE:
Sigma884 0:16243fbc2c6e 208 data_size = fread(&data_double, sizeof(double), 1, file_bin);
Sigma884 0:16243fbc2c6e 209 if(data_size != 0){
Sigma884 0:16243fbc2c6e 210 fprintf(file_out, "%lf\t", data_double);
Sigma884 0:16243fbc2c6e 211 }
Sigma884 0:16243fbc2c6e 212 break;
Sigma884 0:16243fbc2c6e 213
Sigma884 0:16243fbc2c6e 214 case DATA_BOOL:
Sigma884 0:16243fbc2c6e 215 data_size = fread(&data_bool, sizeof(bool), 1, file_bin);
Sigma884 0:16243fbc2c6e 216 if(data_size != 0){
Sigma884 0:16243fbc2c6e 217 fprintf(file_out, "%d\t", data_bool);
Sigma884 0:16243fbc2c6e 218 }
Sigma884 0:16243fbc2c6e 219 break;
Sigma884 0:16243fbc2c6e 220
Sigma884 0:16243fbc2c6e 221 case DATA_CHAR:
Sigma884 0:16243fbc2c6e 222 data_size = fread(&data_char, sizeof(char), 1, file_bin);
Sigma884 0:16243fbc2c6e 223 if(data_size != 0){
Sigma884 0:16243fbc2c6e 224 fprintf(file_out, "%c\t", data_char);
Sigma884 0:16243fbc2c6e 225 }
Sigma884 0:16243fbc2c6e 226 break;
Sigma884 0:16243fbc2c6e 227
Sigma884 0:16243fbc2c6e 228 case DATA_SHORT:
Sigma884 0:16243fbc2c6e 229 data_size = fread(&data_short, sizeof(short), 1, file_bin);
Sigma884 0:16243fbc2c6e 230 if(data_size != 0){
Sigma884 0:16243fbc2c6e 231 fprintf(file_out, "%hd\t", data_short);
Sigma884 0:16243fbc2c6e 232 }
Sigma884 0:16243fbc2c6e 233 break;
Sigma884 0:16243fbc2c6e 234
Sigma884 0:16243fbc2c6e 235 case DATA_LONGLONG:
Sigma884 0:16243fbc2c6e 236 data_size = fread(&data_longlong, sizeof(long long), 1, file_bin);
Sigma884 0:16243fbc2c6e 237 if(data_size != 0){
Sigma884 0:16243fbc2c6e 238 fprintf(file_out, "%lld\t", data_longlong);
Sigma884 0:16243fbc2c6e 239 }
Sigma884 0:16243fbc2c6e 240 break;
Sigma884 0:16243fbc2c6e 241 }
Sigma884 0:16243fbc2c6e 242 }
Sigma884 0:16243fbc2c6e 243
Sigma884 0:16243fbc2c6e 244 if(data_print ++ == 1000){
Sigma884 0:16243fbc2c6e 245 pc.printf(".");
Sigma884 0:16243fbc2c6e 246 data_print = 0;
Sigma884 0:16243fbc2c6e 247 }
Sigma884 0:16243fbc2c6e 248
Sigma884 0:16243fbc2c6e 249 fprintf(file_out, "\r\n");
Sigma884 0:16243fbc2c6e 250 if(data_size == 0){
Sigma884 0:16243fbc2c6e 251 break;
Sigma884 0:16243fbc2c6e 252 }
Sigma884 0:16243fbc2c6e 253 }
Sigma884 0:16243fbc2c6e 254
Sigma884 0:16243fbc2c6e 255 pc.printf("Complete!!\r\n");
Sigma884 0:16243fbc2c6e 256
Sigma884 0:16243fbc2c6e 257
Sigma884 0:16243fbc2c6e 258 //終了
Sigma884 0:16243fbc2c6e 259 fclose(file_bin);
Sigma884 0:16243fbc2c6e 260 fclose(file_out);
Sigma884 0:16243fbc2c6e 261
Sigma884 0:16243fbc2c6e 262 pc.printf("Program Finish!!\r\n");
Sigma884 0:16243fbc2c6e 263
Sigma884 0:16243fbc2c6e 264 while(1) {
Sigma884 0:16243fbc2c6e 265 }
Sigma884 0:16243fbc2c6e 266 }