Étape 5: Écriture du code
Voici un code vb.net pour ce faire :
SerialPort.Open() ' ouvrir le port
SerialPort.DiscardInBuffer() ' effacer la mémoire tampon d’entrée
OutPacket(0) = Strings.Asc("U") ' un vous envoyer et cela affecte le débit en bauds
SerialPort.Write (OutPacket, 0, 1) ' envoyer données dans outpacket commencent à 0, 1 octet
Sleep(100) ' attendre la réponse
SerialPort.Read (InPacket, 0, 1) ' lire 1 octet retour, devrait être 06
SerialPort.Close()
Par la suite, tous les comms aura lieu à ce débit en bauds. Tarifs de 300 à 38400 travail, parler à un PC avec un câble de 3 mètres. Avec un câble plus court, il serait facilement aller plus vite.
Le code ci-dessous est le code source complet en vb.net (vb.net est disponible gratuitement). Les principales complications sont la façon dont l’uDrive scinde les fichiers en morceaux - vous avez besoin regarder les baies et la division (entière) et division reste et écrire ces routines dans votre langue préférée pour votre micro.
L’uDrive coûte $30US.
L’uDrive peut également travailler en mode Raw, où vous lire et écrire dans différents secteurs. Ceci est utile où vous souhaitez l’interface d’un système d’exploitation existant, comme le CP/M. Plus de remue-méninges qui se passe au forum ordinateur Vintage, le forum Picaxe et le forum de N8VEM.
Restez à l’écoute, comme le projet peu suivant sera d’obtenir un 3 $ picaxe 08M pour écrire un petit fichier qui peut être lu par un PC.
Amusez-vous!
' uDrive exemple de code pour vb.net
« configuration de test est un uDrive parlant au port série d’un PC via un max232
« James Moxham mai 2009 moxhamj à internode.on.net
Imports System.IO ' nécessaires à l’exécution des différents appels
Importations de cordes = Microsoft.VisualBasic ' pour permettre d’utiliser les choses comme gauche (et à droite (pour les chaînes
Public Class Main
Dim WithEvents SerialPort As New IO. Ports.SerialPort ' port série déclarer
Public Declare Sub sommeil Lib « kernel32 » (ByVal dwMilliseconds As Integer) ' pour les déclarations de sommeil
Public InPacket(0 To 2000) As Byte ' bug avec serial.write des chaînes comme chr(255) ne sors
Public OutPacket(0 To 50) As Byte ' envoient habituellement seulement quelques octets mais tellement pourrait faire cela plus petits
Private Sub Initialise_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Initialise.Click
« mise en service
« Envoyer un U à la bauds taux de baud sélectionnés pour initialiser
Essayez
SerialPort.PortName = « COM1 »
SerialPort.BaudRate = « 38400 » ' 38400
SerialPort.Parity = IO. Ports.Parity.None ' aucune parité
SerialPort.DataBits = 8 ' 8 bits
SerialPort.StopBits = IO. Ports.StopBits.One ' un bit d’arrêt
SerialPort.ReadTimeout = 1000' millisecondes alors arrive à expiration en 1 seconde si aucune réponse
SerialPort.Open() ' ouvrir le port
SerialPort.DiscardInBuffer() ' effacer la mémoire tampon d’entrée
OutPacket(0) = Strings.Asc("U") ' un vous envoyer et cela affecte le débit en bauds
SerialPort.Write (OutPacket, 0, 1) ' envoyer des données dans le tableau outpacket début à 0 avec 1 octet
Sleep(100) ' attendre la réponse
SerialPort.Read (InPacket, 0, 1) ' lire 1 octet retour, devrait être 06
SerialPort.Close()
Catch ex As Exception
MsgBox ("erreur ouverture port série - est un autre programme utilise COM1?")
SerialPort.Close()
End Try
Si InPacket(0) = 6 Then
TextBox1.Text += « Initialised » + "\n" ' succès
D’autre
TextBox1.Text += « Initialisation a échoué » + "\n" ' échec
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
"arrêt du programme - s’assurer que le port série est fermé
SerialPort.Close()
Fin
End Sub
Private Sub ReadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadFile.Click
« relire un fichier
' nom de fichier est dans la zone de texte dans le format de nom de fichier. TXT dont le nom est de 1 à 8 caractères, et extension est de 3 caractères
Dim Filename As String
Dim LengthFilename As Integer
Dim i As Integer
Dim j As Integer
Dim compteur As Integer
Dim BytesToRead As Integer
Dim taille As Long ' taille du fichier à collationné
Dim PacketSize As Integer
Dim paquets As Long ' nombre de paquets
Dim reste As Long ' reste
Dim Readarray(50000) As Byte ' tableau pour lire les données dans
Dim Readcounter As Long ' compteur pour le readarray
Readcounter = 0' réinitialiser le compteur pour le readarray
PacketSize = 10' utilisation 10 aussi pratique pour picaxe
Filename = TextBox2.Text ' nom du fichier à lire
LengthFilename = Strings.Len(Filename) ' longueur de ce nom de fichier
OutPacket(0) = Strings.Asc (» « commande pour lire
OutPacket(1) = Strings.Asc("a")
OutPacket(2) = PacketSize ' obtenir par blocs de n octets
Compteur = 3' au compteur d’incrémentation
Pour i = 1 To LengthFilename ' envoyons filename
OutPacket(Counter) = Strings.Asc (Strings.Mid (Filename, i, 1))
Compteur = compteur + 1
Prochaine
OutPacket(Counter) = 0' chaîne vide à la fin
Compteur = compteur + 1' un octet plus
SerialPort.Open() ' ouvrir le port série
SerialPort.Write (OutPacket, 0, compteur) ' envoyer des données dans le tableau outpacket début à 0
Sleep(100) ' attendre la réponse
BytesToRead = SerialPort.BytesToRead ' combien d’octets dans la mémoire tampon ? Devrait être de 4
SerialPort.Read (InPacket, 0, BytesToRead) ' lire dans
' obtenir la taille du fichier en octets, msb premières, 4 octets
Taille du fichier = InPacket(0) * 16777216 + InPacket(1) * 65536 + InPacket(2) * 256 + InPacket(3)
Taille du fichier = Filesize + 1' nombre d’octets plus il y a un < ack > sur la fin
Compteur = 0' remise à zéro du compteur
Les paquets = Filesize \ PacketSize ' division d’entiers
Reste = Filesize Mod PacketSize ' et reste gauche sur
Pour i = 0 à sachets - 1' get les n blocs de données
OutPacket(0) = accusé de 6 réception
SerialPort.Write (OutPacket, 0, 1) ' demander un bloc
Sleep(100) ' court retard
SerialPort.Read (InPacket, 0, PacketSize) ' collationné un bloc
For j = 0 To PacketSize - magasin 1' dans un tableau
ReadArray(Readcounter) = InPacket(j)
Readcounter += 1' ajouter 1 à readcounter
Prochaine
Prochaine
« maintenant obtenir le reste
OutPacket(0) = accusé de 6 réception
SerialPort.Write (OutPacket, 0, 1) ' demander un bloc
Sleep(100) ' attendre qu’il revienne
SerialPort.Read (InPacket, 0, reste) ' lire les octets reste, dernière devrait être 06
For j = 0 To reste - magasin 1' dans un tableau
ReadArray(Readcounter) = InPacket(j)
Readcounter += 1' ajouter 1 à readcounter
Prochaine
' impression d’un message pour dire si cela a fonctionné ou pas, c’est à dire est le dernier caractère = 06
Si Readarray (Readcounter - 1) = 6 Then
TextBox1.Text += + "\n" + « Succès lire » + "\n"
D’autre
TextBox1.Text += + "\n" + « Échec de la lecture » + "\n"
End If
' si le fichier est long de 4 octets, alors il y a maintenant un < ack > à la fin
' = 5 octets et le dernier readcounter += 1 fait readcounter = 6
« alors couper et faire la readcounter correcte
Readcounter = Readcounter - 1' sera maintenant = 4
ReadArray(Readcounter) = 0 ' supprimer l’accusé de réception (suppose que c’est venu par le biais, il devrait avoir)
SerialPort.Close() ' fermer le port série
« vb.net code d’essai - imprimer le fichier dans une zone de texte
For i = 0 To Readcounter - 1
TextBox1.Text += Strings.Chr(Readarray(i))
Prochaine
End Sub
Private Sub Dir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Dir.Click
Dim DirBytes As Integer
Dim i As Integer
OutPacket(0) = Strings.Asc (» « commande pour lire
OutPacket(1) = Strings.Asc("d") ' annuaire
OutPacket(2) = Strings.Asc("*") ' obtenir toutes les
OutPacket(3) = 0' zéro à la fin
SerialPort.Open() ' ouvrir le port série
SerialPort.Write (OutPacket, 0, 4) ' envoyer des données dans le tableau outpacket démarrage à
Sleep(2000) ' attendre un certain temps, grandes décharges prennent beaucoup de temps (ou sondage juste l’entrée)
DirBytes = SerialPort.BytesToRead ' nombre d’octets à lire à l’arrière
SerialPort.Read (InPacket, 0, DirBytes)
SerialPort.Close()
' afficher
TextBox1.Text += + "\n"
Pour i = 0 à DirBytes - 2' -1 puis 1 moins pour l’accusé de réception à la fin
Si InPacket(i) <> 10 puis ' 10 est le délimiteur dans cette liste
TextBox1.Text += Strings.Chr(InPacket(i))
D’autre
"remplacer par une nouvelle ligne
TextBox1.Text += + "\n"
End If
Prochaine
End Sub
Private Sub Era_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Era.Click
Dim Filename As String
Dim LengthFilename As Integer
Dim i As Integer
Dim compteur As Integer
Filename = TextBox3.Text
LengthFilename = Strings.Len(Filename)
OutPacket(0) = Strings.Asc ("
OutPacket(1) = Strings.Asc("e") ' effacer
compteur = 2
Pour i = 1 To LengthFilename ' envoyons filename
OutPacket(Counter) = Strings.Asc (Strings.Mid (Filename, i, 1))
Compteur = compteur + 1
Prochaine
OutPacket(Counter) = 0' null string pour terminer
Counter += 1
SerialPort.Open() ' ouvrir le port série
SerialPort.Write (OutPacket, 0, contrer) ' envoyer des données dans le tableau outpacket début à 0
Sleep(100) ' attendre la réponse
SerialPort.Read (InPacket, 0, 1) ' reconnaître
Si InPacket(0) = 6 Then
TextBox1.Text += « Erase succès » + "\n" ' succès
D’autre
TextBox1.Text += « Erase a échoué » + "\n" ' échec
End If
SerialPort.Close()
End Sub
Private Sub Writefile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Writefile.Click
Dim Filestring As String ' commode pour stocker sous forme de chaîne pour les tests
Dim Filearray(1000) As Byte ' travailler avec des tableaux pour le fichier
Dim FileLength aussi longtemps
Dim PacketSize As Integer
Dim i As Integer
Dim j As Integer
Dim Filename As String
Dim paquets aussi longtemps
Dim PacketRemainder As Integer
Protected FileCounter aussi longtemps
FileCounter = 0
Filename = TextBox5.Text ' nom du fichier à enregistrer
Filestring = TextBox4.Text ' ces données seraient normalement venir d’ailleurs
PacketSize = 10
FileLength = Strings.Len(Filestring)
"déplacer la chaîne dans le tableau. (Cette chaîne est juste pratique pour les tests)
For i = 1 To FileLength
Filearray (i - 1) = Strings.Asc (Strings.Mid (Filestring, i, 1)) ' convertir en valeur ascii
Prochaine
« fichier est prêt pour la sortie
OutPacket(0) = Strings.Asc (» « commande
OutPacket(1) = Strings.Asc("t") ' écrire
OutPacket(2) = PacketSize ' taille des paquets 0-50, nouveau fichier (pas ajouter mode)
SerialPort.Open() ' ouvrir le port série
SerialPort.Write (OutPacket, 0, 3) ' envoyer des données dans le tableau outpacket début à 0
Pour i = 1 To Strings.Len(Filename) ' envoyer le nom de fichier
OutPacket(0) = Strings.Asc (Strings.Mid (Filename, i, 1))
SerialPort.Write (OutPacket, 0, 1) ' Envoyer cet octet
Prochaine
OutPacket(0) = 0
SerialPort.Write (OutPacket, 0, 1) ' envoyer une chaîne nulle à résilier
"Envoyer maintenant les 4 octets pour la longueur du fichier
OutPacket(0) = FileLength \ 16777216' division d’entiers
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 65536' division d’entiers
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 256' division d’entiers
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength Mod 256' reste
SerialPort.Write (OutPacket, 0, 1)
Sleep(100) ' attente pour reconnaître
SerialPort.Read (InPacket, 0, 1) ' devrait être 06
Si InPacket(0) <> 6 puis
TextBox1.Text += « Erreur avec la première lecture »
End If
« maintenant envoyer les données en groupes packetsize
Les paquets = FileLength \ PacketSize ' division d’entiers
PacketRemainder = FileLength Mod PacketSize
For i = 1 à paquets
Pour j = 1 à PacketSize
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Prochaine
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Si InPacket(0) <> 6 puis
TextBox1.Text += « Erreur avec le paquet »
End If
Prochaine
« maintenant envoyer le reste s’il existe
Si PacketRemainder <> 0 puis
Pour j = 1 To PacketRemainder
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Prochaine
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Si InPacket(0) <> 6 puis
TextBox1.Text += « Échec d’écriture sur le dernier paquet »
End If
End If
SerialPort.Close()
End Sub
End Class