選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

102 行
2.5KB

  1. // Example use of lfnOpenNext and open by index.
  2. // You can use test files located in
  3. // SdFat/examples/LongFileName/testFiles.
  4. #include<SPI.h>
  5. #include "SdFat.h"
  6. #include "FreeStack.h"
  7. // SD card chip select pin.
  8. const uint8_t SD_CS_PIN = SS;
  9. SdFat sd;
  10. SdFile file;
  11. SdFile dirFile;
  12. // Number of files found.
  13. uint16_t n = 0;
  14. // Max of ten files since files are selected with a single digit.
  15. const uint16_t nMax = 10;
  16. // Position of file's directory entry.
  17. uint16_t dirIndex[nMax];
  18. //------------------------------------------------------------------------------
  19. void setup() {
  20. Serial.begin(9600);
  21. while (!Serial) {}
  22. delay(1000);
  23. // Print the location of some test files.
  24. Serial.println(F("\r\n"
  25. "You can use test files located in\r\n"
  26. "SdFat/examples/LongFileName/testFiles"));
  27. // Initialize at the highest speed supported by the board that is
  28. // not over 50 MHz. Try a lower speed if SPI errors occur.
  29. if (!sd.begin(SD_CS_PIN, SD_SCK_MHZ(50))) {
  30. sd.initErrorHalt();
  31. }
  32. Serial.print(F("FreeStack: "));
  33. Serial.println(FreeStack());
  34. Serial.println();
  35. // List files in root directory.
  36. if (!dirFile.open("/", O_READ)) {
  37. sd.errorHalt("open root failed");
  38. }
  39. while (n < nMax && file.openNext(&dirFile, O_READ)) {
  40. // Skip directories and hidden files.
  41. if (!file.isSubDir() && !file.isHidden()) {
  42. // Save dirIndex of file in directory.
  43. dirIndex[n] = file.dirIndex();
  44. // Print the file number and name.
  45. Serial.print(n++);
  46. Serial.write(' ');
  47. file.printName(&Serial);
  48. Serial.println();
  49. }
  50. file.close();
  51. }
  52. }
  53. //------------------------------------------------------------------------------
  54. void loop() {
  55. int c;
  56. // Read any existing Serial data.
  57. do {
  58. delay(10);
  59. } while (Serial.available() && Serial.read() >= 0);
  60. Serial.print(F("\r\nEnter File Number: "));
  61. while (!Serial.available()) {
  62. SysCall::yield();
  63. }
  64. c = Serial.read();
  65. uint8_t i = c - '0';
  66. if (!isdigit(c) || i >= n) {
  67. Serial.println(F("Invald number"));
  68. return;
  69. }
  70. Serial.println(i);
  71. if (!file.open(&dirFile, dirIndex[i], O_READ)) {
  72. sd.errorHalt(F("open"));
  73. }
  74. Serial.println();
  75. char last = 0;
  76. // Copy up to 500 characters to Serial.
  77. for (int k = 0; k < 500 && (c = file.read()) > 0; k++) {
  78. Serial.write(last = (char)c);
  79. }
  80. // Add new line if missing from last line.
  81. if (last != '\n') {
  82. Serial.println();
  83. }
  84. file.close();
  85. Serial.flush();
  86. delay(100);
  87. }