Stap 5: Schrijven van de code
Hier is sommige vb.net code om dit te doen:
SerialPort.Open() ' de poort openen
SerialPort.DiscardInBuffer() ' de input buffer wissen
OutPacket(0) = Strings.Asc("U") ' een toegestuurd en Hiermee stelt u de baud-rate
SerialPort.Write (OutPacket, 0, 1) ' verzenden gegevens in outpacket beginnen met 0, 1 byte
Sleep(100) ' wacht op antwoord
SerialPort.Read (InPacket, 0, 1) ' lezen van 1 byte terug, moet 06
SerialPort.Close()
Voortaan zullen alle comms deze baud-rate. Prijzen van 300 tot 38400 werken praten op een PC met een kabel van 3 meter. Met een kortere kabel zou het gemakkelijk gaan sneller.
De onderstaande code is de volledige broncode in vb.net (vb.net is beschikbaar kostenloos). De belangrijkste complicaties zijn de manier de uDrive splitst bestanden in stukken - moet u kijken naar de arrays en de integer division en division van de rest en deze routines schrijven in de taal van uw voorkeur voor uw micro.
Kosten van de uDrive is $30US.
De uDrive kan ook werken in Raw-modus, waar u lezen en schrijven naar individuele sectoren. Dit is nuttig op een interface naar een bestaand besturingssysteem, zoals de CP/M waar u wilt. Meer brainstormen gebeurt op de Vintage Computer forum, het forum Picaxe en het N8VEM forum.
Verblijf gestemd, zoals de volgende kleine project te krijgen een $3 picaxe 08M om te schrijven een klein bestand dat kan worden gelezen door een PC.
Veel plezier!
' uDrive-voorbeeldcode voor vb.net
' test setup is een uDrive in gesprek met de seriële poort van een PC via een max232
' James Moxham mei 2009 moxhamj op internode.on.net
Invoer van de System.IO ' die nodig zijn voor het uitvoeren van diverse oproepen
Hiermee importeert u tekenreeksen = Microsoft.VisualBasic ' dus kunt dingen zoals links (en rechts (voor strijkers
Public Class Main
Dim WithEvents SerialPort als nieuwe IO. Ports.SerialPort ' seriële poort verklaren
Openbare Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer) ' voor de verklaringen van de slaap
Openbare InPacket(0 To 2000) As Byte ' insect met serial.write snaren als chr(255) zal niet gaan
Openbare OutPacket(0 To 50) As Byte ' meestal alleen sturen een paar bytes al zo kon dit kleiner maken
Private Sub Initialise_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) verwerkt Initialise.Click
"initialiseren
' Stuur een U de geselecteerde baud rate baud te initialiseren
Probeer
SerialPort.PortName = "COM1"
SerialPort.BaudRate = "38400" ' 38400
SerialPort.Parity = IO. Ports.Parity.None ' geen pariteit
SerialPort.DataBits = 8 ' 8 bits
SerialPort.StopBits = IO. Ports.StopBits.One ' one-stop bits
SerialPort.ReadTimeout = 1000' milliseconden dus een time-out optreedt in 1 seconde als geen reactie
SerialPort.Open() ' de poort openen
SerialPort.DiscardInBuffer() ' de input buffer wissen
OutPacket(0) = Strings.Asc("U") ' een toegestuurd en Hiermee stelt u de baud-rate
SerialPort.Write (OutPacket, 0, 1) ' gegevens verzenden in matrix outpacket beginnen bij 0 met 1 byte
Sleep(100) ' wacht op antwoord
SerialPort.Read (InPacket, 0, 1) ' lezen van 1 byte terug, moet 06
SerialPort.Close()
Catch ex als uitzondering
MsgBox ("Error opening seriële poort - is een ander programma met COM1?")
SerialPort.Close()
Einde proberen
Als InPacket(0) = 6 Then
TextBox1.Text += "Initialised" + vbCrLf ' succes
Anders
TextBox1.Text += "Initialisatie is mislukt" + vbCrLf ' mislukken
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) verwerkt Button2.Click
' shutdown het programma - zorg ervoor dat de seriële poort is gesloten
SerialPort.Close()
Einde
End Sub
Private Sub ReadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) verwerkt ReadFile.Click
' een bestand terug te lezen
' vijl naamwoord zit in het tekstvak in de indeling FILENAME. TXT waarbij naam 1 tot en met 8 tekens en extensie is 3 tekens
Dim bestandsnaam As String
Dim LengthFilename As Integer
Dim i As Integer
Dim j As Integer
Dim Counter As Integer
Dim BytesToRead As Integer
Filesize As Long Dim ' grootte van het bestand te lezen terug
Dim packetomvang As Integer
Pakketten As Long Dim ' aantal pakketten
Rest As Long Dim ' rest
Dim Readarray(50000) As Byte ' matrix om gegevens in te lezen
Dim Readcounter As Long ' teller voor de readarray
Readcounter = 0' reset van de teller voor de readarray
Packetomvang = 10' gebruik 10 net zo gemakkelijk voor picaxe
Filename = TextBox2.Text ' naam van het bestand om te lezen
LengthFilename = Strings.Len(Filename) ' lengte van deze bestandsnaam
OutPacket(0) = Strings.Asc ("' opdracht om te lezen
OutPacket(1) = Strings.Asc("a")
OutPacket(2) = packetomvang ' krijgen in blokken van n bytes
Counter = 3' increment teller
Voor i = 1 To LengthFilename ' bestandsnaam afgeven
OutPacket(Counter) = Strings.Asc (Strings.Mid (Filename, i, 1))
Counter = Counter + 1
Volgende
OutPacket(Counter) = 0' null-reeks om een einde te
Counter = Counter + 1' een meer byte
SerialPort.Open() ' de seriële poort openen
SerialPort.Write (OutPacket, 0, Counter) ' gegevens verzenden in matrix outpacket beginnen bij 0
Sleep(100) ' wacht op antwoord
BytesToRead = SerialPort.BytesToRead ' hoeveel bytes in de buffer? Moet 4
SerialPort.Read (InPacket, 0, BytesToRead) ' lezen in
' krijgen de bestandsgrootte in bytes, msb eerste, 4 bytes
Filesize = InPacket(0) * 16777216 + InPacket(1) * 65536 + InPacket(2) * 256 + InPacket(3)
Filesize = Filesize + 1-nummer van bytes plus is er een < ack > op het einde
Counter = 0' reset van de teller
Pakketten Filesize = \ packetomvang ' integer divisie
Rest = Filesize Mod PacketSize "en links resterende
Voor i = 0 tot pakketten - 1' krijgt de n blokken gegevens
OutPacket(0) = 6' ack
SerialPort.Write (OutPacket, 0, 1) ' een blok aanvragen
Sleep(100) ' korte vertraging
SerialPort.Read (InPacket, 0, packetomvang) ' oplezen van een blok
For j = 0-packetomvang - 1' op te slaan in een array
Readarray(Readcounter) = InPacket(j)
Readcounter += 1' er 1 bij optellen om te readcounter
Volgende
Volgende
' nu de rest
OutPacket(0) = 6' ack
SerialPort.Write (OutPacket, 0, 1) ' een blok aanvragen
Sleep(100) ' wachten om terug te komen
SerialPort.Read (InPacket, 0, rest) ' Lees de rest bytes, laatst moet 06
For j = 0 tot en met rest - 1' op te slaan in een array
Readarray(Readcounter) = InPacket(j)
Readcounter += 1' er 1 bij optellen om te readcounter
Volgende
' print een bericht om te zeggen als het werkte of niet, ie is de laatste teken = 06
Als Readarray (Readcounter - 1) = 6 Then
TextBox1.Text += vbCrLf "Lezen succes" + vbCrLf
Anders
TextBox1.Text += vbCrLf "Lezen fail" + vbCrLf
End If
' als het werkelijke bestand 4 bytes lang is is er nu een < ack > aan het einde
' = 5 bytes en de laatste readcounter += 1 maakt readcounter = 6
' dus trim af en maak de readcounter correct
Readcounter = Readcounter - 1' nu zal worden = 4
Readarray(Readcounter) = 0 ' verwijderen van de ack (aannemen dat het kwam door, het moet)
SerialPort.Close() ' Sluit de seriële poort
' vb.net test code - afdrukken van het bestand in een tekstvak
Voor i = 0 tot Readcounter - 1
TextBox1.Text += Strings.Chr(Readarray(i))
Volgende
End Sub
Private Sub Dir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) verwerkt Dir.Click
Dim DirBytes As Integer
Dim i As Integer
OutPacket(0) = Strings.Asc ("' opdracht om te lezen
OutPacket(1) = Strings.Asc("d") ' directory
OutPacket(2) = Strings.Asc("*") ' krijgen alle
OutPacket(3) = 0' nul te beëindigen
SerialPort.Open() ' de seriële poort openen
SerialPort.Write (OutPacket, 0, 4) ' gegevens verzenden in matrix outpacket beginnen bij
Sleep(2000) ' een tijdje wachten, grote stortplaatsen nemen een lange tijd (of gewoon poll de input)
DirBytes = SerialPort.BytesToRead ' aantal te lezen bytes
SerialPort.Read (InPacket, 0, DirBytes)
SerialPort.Close()
' weer te geven
TextBox1.Text += vbCrLf
Voor i = 0 tot DirBytes - 2' -1 en vervolgens 1 minder voor de ack eind
Als InPacket(i) <> 10 dan ' 10 is het scheidingsteken in deze lijst
TextBox1.Text += Strings.Chr(InPacket(i))
Anders
' vervangen door een nieuwe regel
TextBox1.Text += vbCrLf
End If
Volgende
End Sub
Private Sub Era_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) verwerkt Era.Click
Dim bestandsnaam As String
Dim LengthFilename As Integer
Dim i As Integer
Dim Counter As Integer
Filename = TextBox3.Text
LengthFilename = Strings.Len(Filename)
OutPacket(0) = Strings.Asc ("
OutPacket(1) = Strings.Asc("e") ' wissen
Counter = 2
Voor i = 1 To LengthFilename ' bestandsnaam afgeven
OutPacket(Counter) = Strings.Asc (Strings.Mid (Filename, i, 1))
Counter = Counter + 1
Volgende
OutPacket(Counter) = 0' lege tekenreeks te beëindigen
Teller += 1
SerialPort.Open() ' de seriële poort openen
SerialPort.Write (OutPacket, 0, counter) ' gegevens verzenden in matrix outpacket beginnen bij 0
Sleep(100) ' wacht op antwoord
SerialPort.Read (InPacket, 0, 1) ' erkennen
Als InPacket(0) = 6 Then
TextBox1.Text += "Erase succes" + vbCrLf ' succes
Anders
TextBox1.Text += "Erase mislukt" + vbCrLf ' mislukken
End If
SerialPort.Close()
End Sub
Private Sub Writefile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) verwerkt Writefile.Click
Dim Filestring As String ' handig om op te slaan als een tekenreeks voor het testen
Dim Filearray(1000) As Byte ' werken met arrays voor het bestand
Dim FileLength zo lang
Dim packetomvang As Integer
Dim i As Integer
Dim j As Integer
Dim bestandsnaam As String
Dim pakketten zo lang
Dim PacketRemainder As Integer
Dim FileCounter zo lang
FileCounter = 0
Filename = TextBox5.Text ' naam van het bestand op te slaan
Filestring TextBox4.Text = ' deze gegevens zou normaal komen van ergens anders
Packetomvang = 10
FileLength = Strings.Len(Filestring)
' de tekenreeks in de array te verplaatsen. (Deze string is gewoon een gemak voor het testen)
Voor i = 1 To FileLength
Filearray (i - 1) Strings.Asc (Strings.Mid (Filestring, i, 1)) = ' converteren naar ASCII-waarde
Volgende
' bestand is klaar voor de uitvoer van
OutPacket(0) = Strings.Asc ("' opdracht
OutPacket(1) = Strings.Asc("t") ' schrijven
OutPacket(2) = packetomvang ' omvang van de pakketten van 0-50, nieuw bestand (niet toevoegen binnen wijze)
SerialPort.Open() ' de seriële poort openen
SerialPort.Write (OutPacket, 0, 3) ' gegevens verzenden in matrix outpacket beginnen bij 0
Voor i = 1 To Strings.Len(Filename) ' afgeven van de bestandsnaam
OutPacket(0) = Strings.Asc (Strings.Mid (Filename, i, 1))
SerialPort.Write (OutPacket, 0, 1) ' Stuur dit byte-bereik
Volgende
OutPacket(0) = 0
SerialPort.Write (OutPacket, 0, 1) ' afgeven van een null-tekenreeks te beëindigen
' nu afgeven aan de 4 bytes voor de bestandslengte
OutPacket(0) = FileLength \ 16777216' integer divisie
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 65536' integer divisie
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 256' integer divisie
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength Mod 256' rest
SerialPort.Write (OutPacket, 0, 1)
Sleep(100) ' wachten voor erkennen
SerialPort.Read (InPacket, 0, 1) ' 06 moet worden
Als InPacket(0) <> 6 dan
TextBox1.Text += "Fout met eerste lezen"
End If
' nu afgeven aan de gegevens in packetomvang groepen
Pakketten FileLength = \ packetomvang ' integer divisie
PacketRemainder = FileLength Mod packetomvang
Voor i = 1 To pakketten
For j = 1 To packetomvang
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Volgende
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Als InPacket(0) <> 6 dan
TextBox1.Text += "Fout met packet"
End If
Volgende
' nu de rest afgeven indien aanwezig
Als PacketRemainder <> 0 dan
For j = 1 To PacketRemainder
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Volgende
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Als InPacket(0) <> 6 dan
TextBox1.Text += "Write fail on last packet"
End If
End If
SerialPort.Close()
End Sub
Einde van de klasse