I have been having mixed success with SD. I can usually write to the SD card, and read the contents in my PC. However, when I execute the code below, it will ALWAYS crash during the read segment (ReadFile). It always crashed with this being displayed in the debug window: A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.IO.dll
I am using the latest 4.2 firmware, Visual Studio 2012 Pro, Visual Basic, NetFramework 4.2.
I am using a SanDisk 128MB microSD card.
As this fails after different number of reads, perhaps the hardware is bad. On this assumption I ordered another Netduino Plus 2 which I will try tonight.
I see in the forums that there seem to be quite a bit of problems with the SD card. If anyone has any suggestion on how to resolve this, please comment!
Imports System.netImports System.Net.SocketsImports System.IOImports System.TextImports System.ThreadingImports System.IO.PortsImports Microsoft.SPOTImports Microsoft.SPOT.HardwareImports Microsoft.SPOT.Net.NetworkInformationImports Microsoft.SPOT.IOImports SecretLabs.NETMF.HardwareImports SecretLabs.NETMF.Hardware.NetduinoImports Microsoft.VisualBasic.ConstantsNamespace CFcardUsage Public Module Module1 Dim cardPresent As Boolean = True Sub Main() ' eject handler suggested by Stephan at http://forums.netduino.com/index.php?/topic/5076-detect-eject-sd-card-in-vbnet/ AddHandler SPOT.IO.RemovableMedia.Eject, AddressOf RemovableMedia_Eject AddHandler Microsoft.SPOT.IO.RemovableMedia.Insert, AddressOf RemovableMedia_Insert Debug.Print("Startup CF Card Usage") ' Define path and filename Dim strPath As String = "SD" & DateTime.Now.ToString("yyyyMM") Dim strFileName As String = strPath & "" & DateTime.Now.ToString("yyyyMMdd") & ".log" ' make sure disk is there and create directory if needed Try If Not File.Exists(strFileName) Then ' ** This shows a System.io.ioexception AND the following line executes, also throwing an exception If Not Directory.Exists(strPath) Then '** This also shows a System.IO.IOexception in debugger, and the following line executes Directory.CreateDirectory(strPath) ' ** the exception appears to be thrown her and goes to the catch End If End If Catch ex As Exception Debug.Print("Exception thrown - " & ex.Message) Debug.Print("Presumably there is no readable card present") cardPresent = False End Try ' if no card is found, wait for one to be inserted Do While True If cardPresent Then Exit Do Debug.Print("insert card") Threading.Thread.Sleep(1000) Loop Debug.Print(strFileName) ' open the streamwriter Dim sw As StreamWriter = New StreamWriter(File.OpenWrite(strFileName)) sw.WriteLine("This is to write the files to the netduino card") 'lets learn how fast we can write to these cards Dim StartTime As DateTime = DateTime.Now Dim excp As Boolean = False For i As Integer = 0 To 10000 Dim t As String = DateTime.Now.ToString Dim EndTime As TimeSpan = DateTime.Now.Subtract(StartTime) Try ' if this fails, lets get the error, and stop writing so I can see if prior data is ok sw.Write("Memory usage " & Microsoft.SPOT.Debug.GC(False).ToString & "; Elapsed time " & EndTime.Seconds.ToString & "." & EndTime.Milliseconds.ToString) sw.WriteLine("; line number " & i.ToString & " at " & t & ", ms counter = " & DateTime.Now.Millisecond.ToString & ", tics= " & DateTime.Now.Ticks.ToString & ", machine time " & Hardware.Utility.GetMachineTime.Ticks.ToString) Catch ex As Exception Debug.Print("Exception " & ex.Message & ", at i=" & i.ToString & ", ET= " & EndTime.ToString) ' exit the write loop Exit For End Try If i Mod 1000 = 0 Then Debug.Print(i.ToString) Next ' try everything possible to make sure the writes are complete to the card sw.Flush() sw.BaseStream.Flush() sw.BaseStream.Close() sw.Dispose() ' if there was a write error, just exit, otherwise read back the contents If Not excp Then ReadFile(strFileName) End Sub Sub ReadFile(filename As String) ' this will read and display the contents of the card. If File.Exists(filename) = False Then Debug.Print("File does not exist") Return End If Dim sr As StreamReader = New StreamReader(filename) Dim s As String = "" Do Try s = sr.ReadLine() ' crashes with index out of range exception (system.io.dll) after some number of reads Catch ex As Exception ' must use a try/catch or file will be deleted or not found. Does not seen to always work Debug.Print("Error in ReadFile; " & ex.Message) Exit Do End Try Debug.Print("Mem now: " & Microsoft.SPOT.Debug.GC(False).ToString & "; Recorded data: " & s) Loop Until sr.EndOfStream Debug.Print("Last line read was: " & s) sr.Close() sr.Dispose() End Sub Sub RemovableMedia_Eject(sender As Object, e As Microsoft.SPOT.IO.MediaEventArgs) Debug.Print("Ejected") cardPresent = False End Sub Sub RemovableMedia_Insert(sender As Object, e As Microsoft.SPOT.IO.MediaEventArgs) Debug.Print("Inserted or present") cardPresent = True End Sub End ModuleEnd Namespace