Enkel lagring för projektet microcontroller (5 / 5 steg)
Steg 5: Skriva koden
Här är några vb.net-kod att göra detta:
SerialPort.Open() ' öppna porten
SerialPort.DiscardInBuffer() ' Rensa indatabufferten
OutPacket(0) = Strings.Asc("U") ' Skicka en och detta ställer baudhastighet
SerialPort.Write (OutPacket, 0, 1) ' Skicka data i outpacket börjar 0, 1 byte
Sleep(100) "vänta på svar
SerialPort.Read (InPacket, 0, 1) ' läsa 1 byte tillbaka, bör 06
SerialPort.Close()
Nu blir alla komm på denna baud. Priser från 300 till 38400 arbete talar till en dator med en 3 meter lång kabel. Med en kortare kabel skulle det lätt gå snabbare.
Koden nedan är den kompletta källkoden i vb.net (vb.net är gratis). Huvudsakliga komplikationerna är hur uDrive delar filer upp i bitar - du måste titta på arrayer och heltalsdivision och resten frågor och skriva dessa rutiner i önskat språk för din mikro.
UDrive kostar $30US.
UDrive kan också arbeta i Raw-läge, där du läsa och skriva till enskilda sektorer. Detta är användbart om du vill gränssnitt till ett existerande operativsystem, till exempel CP/M. Mer kreativitet händer på Vintage dator forum, Picaxe forumet och N8VEM forum.
Håll ögonen öppna, eftersom nästa lilla projekt är att få en $3 picaxe 08M att skriva en liten fil som kan läsas av en PC.
Ha det så kul!
"uDrive exempelkod till vb.net
"test setup är en uDrive som talar till en dator serieport via en max232
"James Moxham maj 2009 moxhamj på internode.on.net
Importerar System.IO "behövs för att köra olika samtal
Importerar strängarna = Microsoft.VisualBasic "så kan använda saker som vänster (och rätt (för strängar
Public Class Main
Dim WithEvents SerialPort som nya IO. Ports.SerialPort "serieport deklarera
Offentligt deklarera Sub sömn Lib "kernel32" (ByVal dwMilliseconds As Integer) "för sömn uttalanden
Offentliga InPacket(0 To 2000) som Byte ' bugg med serial.write strängar som chr(255) brukar gå
Offentliga OutPacket(0 To 50) som Byte "vanligt endast skicka ut några byte ändå så kunde göra detta mindre
Private Sub Initialise_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Initialise.Click
"initiera
"skicka en U på den valda baud klassar baud mottagarens initialisering
Försök
SerialPort.PortName = "COM1"
SerialPort.BaudRate = "38400" "38400
SerialPort.Parity = IO. Ports.Parity.None ' ingen paritet
SerialPort.DataBits = 8 ' 8 bitar
SerialPort.StopBits = IO. Ports.StopBits.One "en stoppbit
SerialPort.ReadTimeout = 1000' millisekunder så gånger i 1 sekund om inget svar
SerialPort.Open() ' öppna porten
SerialPort.DiscardInBuffer() ' Rensa indatabufferten
OutPacket(0) = Strings.Asc("U") ' Skicka en och detta ställer baudhastighet
SerialPort.Write (OutPacket, 0, 1) ' Skicka data i matrisen outpacket börjar på 0 med 1 byte
Sleep(100) "vänta på svar
SerialPort.Read (InPacket, 0, 1) ' läsa 1 byte tillbaka, bör 06
SerialPort.Close()
Fånga som undantag
MsgBox ("fel öppning seriell port - är ett annat program använder COM1?")
SerialPort.Close()
Slutet försök
Om InPacket(0) = 6 då
TextBox1.Text += "Initialised" + vbCrLf "framgång
Annat
TextBox1.Text += "Initiering misslyckades" + vbCrLf "misslyckas
Slut om
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Button2.Click
"avstängning programmet - kontrollera seriella porten är stängd
SerialPort.Close()
Slutet
End Sub
Private Sub ReadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar ReadFile.Click
"läsa tillbaka en fil
"namn är i textrutan i formatet FILENAME. TXT där namn är 1 till 8 tecken och förlängning är 3 tecken
Dim filnamn som sträng
Dim LengthFilename som heltal
Dim jag som heltal
Dim j som heltal
Dim Counter som heltal
Dim BytesToRead som heltal
Dim filstorlek As Long ' storleken på filen för att läsa tillbaka
Dim PacketSize som heltal
Dim paket As Long ' antal paket
Dim resten As Long ' resten
Dim Readarray(50000) som Byte "matris att läsa data i
Dim Readcounter As Long ' counter för readarray
Readcounter = 0' Återställ räknaren för readarray
PacketSize = 10' Använd 10 som bekvämt för picaxe
Filnamn = TextBox2.Text ' namn av arkivera läsa
LengthFilename = Strings.Len(Filename) ' längd av detta filnamn
OutPacket(0) = Strings.Asc ("" kommandot för att läsa
OutPacket(1) = Strings.Asc("a")
OutPacket(2) = PacketSize ' få i block av n byte
Räknare = 3' steg counter
För i = 1 till LengthFilename "skicka ut filnamn
OutPacket(Counter) = Strings.Asc (Strings.Mid (filnamn, i 1))
Räknare = räknare + 1
Nästa
OutPacket(Counter) = 0' null-sträng till slut
Räknare = räknare + 1' en mer byte
SerialPort.Open() ' öppna den seriella porten
SerialPort.Write (OutPacket, 0, Counter) ' Skicka data i matrisen outpacket börjar på 0
Sleep(100) "vänta på svar
BytesToRead = SerialPort.BytesToRead ' hur många byte i bufferten? Bör vara 4
SerialPort.Read (InPacket, 0, BytesToRead) ' läsa dem i
"få storleken i byte, msb första, 4 byte
Filesize = InPacket(0) * 16777216 + InPacket(1) * 65536 + InPacket(2) * 256 + InPacket(3)
Filesize = filstorlek + 1' antal byte plus det finns en < ack > på slutet
Räknare = 0' Återställ räknaren
Paket = filstorlek \ PacketSize ' heltalsdivision
Resten = Filesize Mod PacketSize ' och resten vänster över
För i = 0 till paket - 1' get n block av data
OutPacket(0) = 6' ack
SerialPort.Write (OutPacket, 0, 1) ' begära ett block
Sleep(100) ' kort fördröjning
SerialPort.Read (InPacket, 0, PacketSize) ' läsa tillbaka ett block
För j = 0 till PacketSize - 1' butik i en matris
Readarray(Readcounter) = InPacket(j)
Readcounter + = 1' lägga till 1 i readcounter
Nästa
Nästa
"nu får resten
OutPacket(0) = 6' ack
SerialPort.Write (OutPacket, 0, 1) ' begära ett block
Sleep(100) "vänta på att komma tillbaka
SerialPort.Read (InPacket, 0, resten) "Läs resten bytes, senast ska vara 06
För j = 0 till resten - 1' butik i en matris
Readarray(Readcounter) = InPacket(j)
Readcounter + = 1' lägga till 1 i readcounter
Nästa
"skriva ut ett meddelande att säga om det fungerade eller inte, dvs är det sista tecknet = 06
Om Readarray (Readcounter - 1) = 6 då
TextBox1.Text += vbCrLf + "Läs framgång" + vbCrLf
Annat
TextBox1.Text += vbCrLf + "Läs misslyckas" + vbCrLf
Slut om
"om den faktiska filen är 4 byte lång så det finns nu en < ack > i slutet
' = 5 byte och sist readcounter += 1 gör readcounter = 6
"så trimma bort och gör readcounter rätt
Readcounter = Readcounter - 1' nu kommer vara = 4
Readarray(Readcounter) = 0 ' stryka ack (antar det kom igenom, det bör ha)
SerialPort.Close() ' stänga den seriella porten
"vb.net testa koden - skriva ut filen i en textruta
För i = 0 till Readcounter - 1
TextBox1.Text += Strings.Chr(Readarray(i))
Nästa
End Sub
Private Sub Dir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Dir.Click
Dim DirBytes som heltal
Dim jag som heltal
OutPacket(0) = Strings.Asc ("" kommandot för att läsa
OutPacket(1) = Strings.Asc("d") ' katalog
OutPacket(2) = Strings.Asc("*") ' få alla
OutPacket(3) = 0' noll till slut
SerialPort.Open() ' öppna den seriella porten
SerialPort.Write (OutPacket, 0, 4) "skicka data i matrisen outpacket start på
Sleep(2000) "vänta ett tag, stora dumpar ta lång tid (eller bara avsöka indata)
DirBytes = SerialPort.BytesToRead ' antal byte att läsa tillbaka
SerialPort.Read (InPacket, 0, DirBytes)
SerialPort.Close()
"Visa det
TextBox1.Text += vbCrLf
För i = 0 till DirBytes - 2' -1 och sedan 1 mindre för ack i slutet
Om InPacket(i) <> 10 sedan ' 10 är avgränsaren i denna lista
TextBox1.Text += Strings.Chr(InPacket(i))
Annat
"Ersätt med en ny rad
TextBox1.Text += vbCrLf
Slut om
Nästa
End Sub
Private Sub Era_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Era.Click
Dim filnamn som sträng
Dim LengthFilename som heltal
Dim jag som heltal
Dim Counter som heltal
Filnamn = TextBox3.Text
LengthFilename = Strings.Len(Filename)
OutPacket(0) = Strings.Asc ("
OutPacket(1) = Strings.Asc("e") ' Radera
räknare = 2
För i = 1 till LengthFilename "skicka ut filnamn
OutPacket(Counter) = Strings.Asc (Strings.Mid (filnamn, i 1))
Räknare = räknare + 1
Nästa
OutPacket(Counter) = 0' null-sträng att avsluta
Motverka += 1
SerialPort.Open() ' öppna den seriella porten
SerialPort.Write (OutPacket, 0, motverka) ' Skicka data i matrisen outpacket börjar på 0
Sleep(100) "vänta på svar
SerialPort.Read (InPacket, 0, 1) ' erkänna
Om InPacket(0) = 6 då
TextBox1.Text += "Radera framgång" + vbCrLf "framgång
Annat
TextBox1.Text += "Radera misslyckades" + vbCrLf "misslyckas
Slut om
SerialPort.Close()
End Sub
Private Sub Writefile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Writefile.Click
Dim Filestring As String "bekvämt lagra som en sträng för att testa
Dim Filearray(1000) som Byte ' arbete med matriser för filen
Dim FileLength så länge
Dim PacketSize som heltal
Dim jag som heltal
Dim j som heltal
Dim filnamn som sträng
Dim paket så länge
Dim PacketRemainder som heltal
Dim FileCounter så länge
FileCounter = 0
Filnamn = TextBox5.Text ' namn på fil för att spara
Filestring = TextBox4.Text ' dessa data skulle normalt komma från någon annanstans
PacketSize = 10
FileLength = Strings.Len(Filestring)
"flytta strängen i vektorn. (Denna sträng är bara en bekvämlighet för testning)
För i = 1 till FileLength
Filearray (i - 1) = Strings.Asc (Strings.Mid (Filestring, i, 1)) ' konvertera till ASCII-värde
Nästa
"filen är klar att produktionen
OutPacket(0) = Strings.Asc ("" kommandot
OutPacket(1) = Strings.Asc("t") ' skriva
OutPacket(2) = PacketSize ' storlek paket 0-50, ny fil (inte append läge)
SerialPort.Open() ' öppna den seriella porten
SerialPort.Write (OutPacket, 0, 3) "skicka data i matrisen outpacket börjar på 0
För i = 1 till Strings.Len(Filename) "skicka ut filnamnet
OutPacket(0) = Strings.Asc (Strings.Mid (filnamn, i 1))
SerialPort.Write (OutPacket, 0, 1) ' Skicka den byten
Nästa
OutPacket(0) = 0
SerialPort.Write (OutPacket, 0, 1) ' Skicka ut en null-sträng för att avsluta
"nu sända 4 byte för filen längd
OutPacket(0) = FileLength \ 16777216' heltalsdivision
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 65536' heltalsdivision
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 256' heltalsdivision
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength Mod 256' resten
SerialPort.Write (OutPacket, 0, 1)
Sleep(100) "vänta på att erkänna
SerialPort.Read (InPacket, 0, 1) ' bör vara 06
Om InPacket(0) <> 6 sedan
TextBox1.Text += "Fel med första Läs"
Slut om
"nu sända data i packetsize grupper
Paket = FileLength \ PacketSize ' heltalsdivision
PacketRemainder = FileLength Mod PacketSize
För i = 1 till paket
För j = 1 till PacketSize
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Nästa
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Om InPacket(0) <> 6 sedan
TextBox1.Text += "Fel med paket"
Slut om
Nästa
"nu skicka ut resten om det finns
Om PacketRemainder <> 0 sedan
För j = 1 till PacketRemainder
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Nästa
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Om InPacket(0) <> 6 sedan
TextBox1.Text += "Skriva misslyckas på sista packet"
Slut om
Slut om
SerialPort.Close()
End Sub
Avsluta klass