arduino stuffs
Diffstat (limited to 'libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino')
-rw-r--r--libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino91
1 files changed, 91 insertions, 0 deletions
diff --git a/libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino b/libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino
new file mode 100644
index 0000000..29d8ec6
--- /dev/null
+++ b/libraries/SD/examples/NonBlockingWrite/NonBlockingWrite.ino
@@ -0,0 +1,91 @@
+/*
+ Non-blocking Write
+
+ This example demonstrates how to perform non-blocking writes
+ to a file on a SD card. The file will contain the current millis()
+ value every 10ms. If the SD card is busy, the data will be buffered
+ in order to not block the sketch.
+
+ NOTE: myFile.availableForWrite() will automatically sync the
+ file contents as needed. You may lose some unsynced data
+ still if myFile.sync() or myFile.close() is not called.
+
+ The circuit:
+ - Arduino MKR Zero board
+ - micro SD card attached
+
+ This example code is in the public domain.
+*/
+
+#include <SD.h>
+
+// file name to use for writing
+const char filename[] = "demo.txt";
+
+// File object to represent file
+File txtFile;
+
+// string to buffer output
+String buffer;
+
+unsigned long lastMillis = 0;
+
+void setup() {
+ Serial.begin(9600);
+ while (!Serial);
+
+ // reserve 1kB for String used as a buffer
+ buffer.reserve(1024);
+
+ // set LED pin to output, used to blink when writing
+ pinMode(LED_BUILTIN, OUTPUT);
+
+ // init the SD card
+ if (!SD.begin()) {
+ Serial.println("Card failed, or not present");
+ // don't do anything more:
+ while (1);
+ }
+
+ // If you want to start from an empty file,
+ // uncomment the next line:
+ // SD.remove(filename);
+
+ // try to open the file for writing
+ txtFile = SD.open(filename, FILE_WRITE);
+ if (!txtFile) {
+ Serial.print("error opening ");
+ Serial.println(filename);
+ while (1);
+ }
+
+ // add some new lines to start
+ txtFile.println();
+ txtFile.println("Hello World!");
+}
+
+void loop() {
+ // check if it's been over 10 ms since the last line added
+ unsigned long now = millis();
+ if ((now - lastMillis) >= 10) {
+ // add a new line to the buffer
+ buffer += "Hello ";
+ buffer += now;
+ buffer += "\r\n";
+
+ lastMillis = now;
+ }
+
+ // check if the SD card is available to write data without blocking
+ // and if the buffered data is enough for the full chunk size
+ unsigned int chunkSize = txtFile.availableForWrite();
+ if (chunkSize && buffer.length() >= chunkSize) {
+ // write to file and blink LED
+ digitalWrite(LED_BUILTIN, HIGH);
+ txtFile.write(buffer.c_str(), chunkSize);
+ digitalWrite(LED_BUILTIN, LOW);
+
+ // remove written data from buffer
+ buffer.remove(0, chunkSize);
+ }
+}