Example of using the SDFileSystem library on a K64F to write data to files and also read data into dynamically created arrays.

Dependencies:   mbed

Committer:
eencae
Date:
Fri Mar 11 16:07:41 2016 +0000
Revision:
0:5448330e1a33
Child:
1:caceb9d9d17a
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:5448330e1a33 1 /* 2545_SD_Card Example
eencae 0:5448330e1a33 2
eencae 0:5448330e1a33 3 Example of writing data to SD card.
eencae 0:5448330e1a33 4
eencae 0:5448330e1a33 5 Based on FTF2014_lab4 Example
eencae 0:5448330e1a33 6
eencae 0:5448330e1a33 7 https://developer.mbed.org/teams/Freescale/wiki/FTF2014_workshop
eencae 0:5448330e1a33 8
eencae 0:5448330e1a33 9 Craig A. Evans, University of Leeds, Mar 2016
eencae 0:5448330e1a33 10
eencae 0:5448330e1a33 11 */
eencae 0:5448330e1a33 12
eencae 0:5448330e1a33 13 #include "mbed.h"
eencae 0:5448330e1a33 14 #include "SDFileSystem.h"
eencae 0:5448330e1a33 15
eencae 0:5448330e1a33 16 // Connections to SD card holder on K64F (SPI interface)
eencae 0:5448330e1a33 17 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
eencae 0:5448330e1a33 18 Serial serial(USBTX, USBRX); // for PC debug
eencae 0:5448330e1a33 19
eencae 0:5448330e1a33 20 void delete_file(char filename[]);
eencae 0:5448330e1a33 21
eencae 0:5448330e1a33 22 int main()
eencae 0:5448330e1a33 23 {
eencae 0:5448330e1a33 24 serial.baud(115200); // full-speed!
eencae 0:5448330e1a33 25 serial.printf("#### SD Card Example #####\n");
eencae 0:5448330e1a33 26 FILE *fp; // this is our file pointer
eencae 0:5448330e1a33 27 wait(1);
eencae 0:5448330e1a33 28
eencae 0:5448330e1a33 29 // Various examples below - can comment out ones you don't need
eencae 0:5448330e1a33 30
eencae 0:5448330e1a33 31 /////////////////////// Deleting file example ////////////////////////
eencae 0:5448330e1a33 32
eencae 0:5448330e1a33 33 // comment this line out if you don't want to delete the file!
eencae 0:5448330e1a33 34 delete_file("/sd/test.txt");
eencae 0:5448330e1a33 35
eencae 0:5448330e1a33 36 ////////////////////// Simple writing example //////////////////////////
eencae 0:5448330e1a33 37
eencae 0:5448330e1a33 38 // open file for writing ('w') - creates file if it doesn't exist and overwrites
eencae 0:5448330e1a33 39 // if it does. If you wish to add a score onto a list, then you can
eencae 0:5448330e1a33 40 // append instead 'a'. This will open the file if it exists and start
eencae 0:5448330e1a33 41 // writing at the end. It will create the file if it doesn't exist.
eencae 0:5448330e1a33 42 fp = fopen("/sd/topscore.txt", "w");
eencae 0:5448330e1a33 43 int top_score = 56; // random example
eencae 0:5448330e1a33 44
eencae 0:5448330e1a33 45 if (fp == NULL) { // if it can't open the file then print error message
eencae 0:5448330e1a33 46 serial.printf("Error! Unable to open file!\n");
eencae 0:5448330e1a33 47 } else { // opened file so can write
eencae 0:5448330e1a33 48 serial.printf("Writing to file....");
eencae 0:5448330e1a33 49 fprintf(fp, "%d",top_score); // ensure data type matches
eencae 0:5448330e1a33 50 serial.printf("Done.\n");
eencae 0:5448330e1a33 51 fclose(fp); // ensure you close the file after writing
eencae 0:5448330e1a33 52 }
eencae 0:5448330e1a33 53
eencae 0:5448330e1a33 54 ////////////////////// Simple reading example //////////////////////////
eencae 0:5448330e1a33 55
eencae 0:5448330e1a33 56 // now open file for reading
eencae 0:5448330e1a33 57 fp = fopen("/sd/topscore.txt", "r");
eencae 0:5448330e1a33 58 int stored_top_score = -1; // -1 to demonstrate it has changed after reading
eencae 0:5448330e1a33 59
eencae 0:5448330e1a33 60 if (fp == NULL) { // if it can't open the file then print error message
eencae 0:5448330e1a33 61 serial.printf("Error! Unable to open file!\n");
eencae 0:5448330e1a33 62 } else { // opened file so can write
eencae 0:5448330e1a33 63 fscanf(fp, "%d",&stored_top_score); // ensure data type matches - note address operator (&)
eencae 0:5448330e1a33 64 serial.printf("Read %d from file.\n",stored_top_score);
eencae 0:5448330e1a33 65 fclose(fp); // ensure you close the file after reading
eencae 0:5448330e1a33 66 }
eencae 0:5448330e1a33 67
eencae 0:5448330e1a33 68 ///////////////////// Writing list to file example //////////////////////
eencae 0:5448330e1a33 69
eencae 0:5448330e1a33 70 // for this example, I'll create some numbers to write to file in a big list
eencae 0:5448330e1a33 71 // a data logger for example will usually append to a file - at a reading
eencae 0:5448330e1a33 72 // at the end rather than creating a new file
eencae 0:5448330e1a33 73 fp = fopen("/sd/test.txt", "a");
eencae 0:5448330e1a33 74
eencae 0:5448330e1a33 75 if (fp == NULL) { // if it can't open the file then print error message
eencae 0:5448330e1a33 76 serial.printf("Error! Unable to open file!\n");
eencae 0:5448330e1a33 77 } else { // opened file so can write
eencae 0:5448330e1a33 78 serial.printf("Writing to file....");
eencae 0:5448330e1a33 79 for(int i = 1; i <= 50; i++) {
eencae 0:5448330e1a33 80 float dummy = 1000.0F/i; // dummy variable
eencae 0:5448330e1a33 81 fprintf(fp, "%d,%f\n",i,dummy); // print formatted string to file (CSV)
eencae 0:5448330e1a33 82 }
eencae 0:5448330e1a33 83 serial.printf("Done.\n");
eencae 0:5448330e1a33 84 fclose(fp); // ensure you close the file after writing
eencae 0:5448330e1a33 85 }
eencae 0:5448330e1a33 86
eencae 0:5448330e1a33 87 // you can comment out the writing example to check that the writing has
eencae 0:5448330e1a33 88 // worked - when you run it after commenting, it should still open the
eencae 0:5448330e1a33 89 // file that exists on the SD card - assuming you didn't delete it!
eencae 0:5448330e1a33 90
eencae 0:5448330e1a33 91 /////////////////////// Reading from file example ////////////////////////
eencae 0:5448330e1a33 92
eencae 0:5448330e1a33 93 // now open file for reading...note the 'r'
eencae 0:5448330e1a33 94 fp = fopen("/sd/test.txt", "r");
eencae 0:5448330e1a33 95 if (fp == NULL) { // if it can't open the file then print error message
eencae 0:5448330e1a33 96 serial.printf("Error! Unable to open file!\n");
eencae 0:5448330e1a33 97 } else {
eencae 0:5448330e1a33 98 serial.printf("Reading file....\n");
eencae 0:5448330e1a33 99 int i; // create suitable variables to store the data in the file
eencae 0:5448330e1a33 100 float value;
eencae 0:5448330e1a33 101
eencae 0:5448330e1a33 102 // in this example, we keep reading (using fscanf) until we reach
eencae 0:5448330e1a33 103 // the 'end of file'. Note we use the address operator & to write
eencae 0:5448330e1a33 104 // to the variables. Also the format of the string must match what
eencae 0:5448330e1a33 105 // is in the file
eencae 0:5448330e1a33 106 while (fscanf(fp, "%d,%f", &i, &value) != EOF) {
eencae 0:5448330e1a33 107 serial.printf("%d,%f\n",i,value);
eencae 0:5448330e1a33 108 }
eencae 0:5448330e1a33 109 serial.printf("Done.\n");
eencae 0:5448330e1a33 110 fclose(fp); // ensure you close the file after reading
eencae 0:5448330e1a33 111 }
eencae 0:5448330e1a33 112
eencae 0:5448330e1a33 113 ///////////////// Advanced Reading from file example ///////////////////
eencae 0:5448330e1a33 114
eencae 0:5448330e1a33 115 // the previous example just read the values into variables and printed to
eencae 0:5448330e1a33 116 // serial, we'll now read files into an array.
eencae 0:5448330e1a33 117
eencae 0:5448330e1a33 118 // now open file for reading...note the 'r'
eencae 0:5448330e1a33 119 fp = fopen("/sd/test.txt", "r");
eencae 0:5448330e1a33 120
eencae 0:5448330e1a33 121 int n=0; // going to store the number of lines in the file
eencae 0:5448330e1a33 122 int *index_array; // pointers to create dynamic arrays later
eencae 0:5448330e1a33 123 float *value_array; // note memory will be in heap rather than on the stack
eencae 0:5448330e1a33 124
eencae 0:5448330e1a33 125 if (fp == NULL) { // if it can't open the file then print error message
eencae 0:5448330e1a33 126 serial.printf("Error! Unable to open file!\n");
eencae 0:5448330e1a33 127 } else {
eencae 0:5448330e1a33 128 serial.printf("Counting lines in file....\n");
eencae 0:5448330e1a33 129 //Since we may not know the
eencae 0:5448330e1a33 130 // number of lines in the files ahead of time, we'll first count them
eencae 0:5448330e1a33 131 // * means scan but don't save
eencae 0:5448330e1a33 132 while (fscanf(fp, "%*d,%*f") != EOF) {
eencae 0:5448330e1a33 133 n++; // increment counter when read a line
eencae 0:5448330e1a33 134 }
eencae 0:5448330e1a33 135
eencae 0:5448330e1a33 136
eencae 0:5448330e1a33 137 serial.printf("Read %d lines\n",n);
eencae 0:5448330e1a33 138 serial.printf("Creating dynamic arrays...\n");
eencae 0:5448330e1a33 139 // calloc creates an array and initilises to 0
eencae 0:5448330e1a33 140 // malloc returns unitialised array - diffrent syntax
eencae 0:5448330e1a33 141 index_array = (int *)calloc(n, sizeof (int));
eencae 0:5448330e1a33 142 value_array = (float *)calloc(n, sizeof (float));
eencae 0:5448330e1a33 143
eencae 0:5448330e1a33 144 int i=0;
eencae 0:5448330e1a33 145 rewind(fp); // 'scrolled' to end of file, so go back to beginning
eencae 0:5448330e1a33 146 serial.printf("Reading into arrays...\n");
eencae 0:5448330e1a33 147 while (fscanf(fp, "%d,%f",&index_array[i],&value_array[i]) != EOF) {
eencae 0:5448330e1a33 148 i++; // read data into array and increment index
eencae 0:5448330e1a33 149 }
eencae 0:5448330e1a33 150 serial.printf("Done.\n");
eencae 0:5448330e1a33 151 fclose(fp); // ensure you close the file after reading
eencae 0:5448330e1a33 152 }
eencae 0:5448330e1a33 153
eencae 0:5448330e1a33 154 // we should now have the data in the arrays, will print to serial to check
eencae 0:5448330e1a33 155 for(int i=0; i<n ; i++) {
eencae 0:5448330e1a33 156 serial.printf("[%d] %d,%f\n",i,index_array[i],value_array[i]);
eencae 0:5448330e1a33 157 }
eencae 0:5448330e1a33 158
eencae 0:5448330e1a33 159 ///////////////////////////////////////////////////
eencae 0:5448330e1a33 160 serial.printf("End of SD card example\n");
eencae 0:5448330e1a33 161 }
eencae 0:5448330e1a33 162
eencae 0:5448330e1a33 163 void delete_file(char filename[])
eencae 0:5448330e1a33 164 {
eencae 0:5448330e1a33 165 serial.printf("Deleting file '%s'...",filename);
eencae 0:5448330e1a33 166 FILE *fp = fopen(filename, "r"); // try and open file
eencae 0:5448330e1a33 167 if (fp != NULL) { // if it does open...
eencae 0:5448330e1a33 168 fclose(fp); // close it
eencae 0:5448330e1a33 169 remove(filename); // and then delete
eencae 0:5448330e1a33 170 serial.printf("Done!\n");
eencae 0:5448330e1a33 171 }
eencae 0:5448330e1a33 172 // if we can't open it, it doesn't exist and so we can't delete it
eencae 0:5448330e1a33 173 }