Paso 5: Escribir el código
Aquí le damos algunos código de vb.net para ello:
SerialPort.Open() ' abrir el puerto
SerialPort.DiscardInBuffer() ' borrar el búfer de entrada
OutPacket(0) = Strings.Asc("U") ' enviar un y esto fija la tasa de baudios
SerialPort.Write (OutPacket, 0, 1) ' enviar datos en outpacket 0, 1 byte de comienzo
Sleep(100) ' esperar respuesta
SerialPort.Read (InPacket, 0, 1) ' leer detrás de 1 byte, debe ser 06
SerialPort.Close()
De ahora en adelante, toda comunicación será a esta velocidad. Velocidades de 300 a 38400 trabajo hablar a un PC con un cable de 3 metros. Con un cable más corto fácilmente iría más rápido.
El código siguiente es el código fuente completo en vb.net (vb.net está disponible gratis). Las principales complicaciones son la manera el uDrive divide archivos en pedazos - necesita ver los arreglos de discos y el resto división y división de enteros y escribir estas rutinas en su idioma preferido para tu micro.
Costo de la uDrive es $30US.
El uDrive también puede trabajar en modo Raw, donde leer y escribir en distintos sectores. Esto es útil donde desea que la interfaz a un sistema operativo existente, tales como CP/M. Ideas más está sucediendo en el foro de equipo Vintage, el Picaxe y el forum de N8VEM.
Estad atentos, que el próximo proyecto poco será obtener un $3 picaxe 08M escribir un pequeño archivo que puede ser leído por un ordenador.
¡Que te diviertas!
' uDrive ejemplo de código para vb.net
' configuración de prueba es un uDrive hablando al puerto serie del PC mediante un max232
' James Moxham moxhamj de mayo de 2009 en internode.on.net
Las importaciones de System.IO ' necesaria para ejecutar varias llamadas
Las importaciones de cadenas = Microsoft.VisualBasic ' por lo que puede usar cosas como izquierda (y derecha (para cuerdas
Public Class Main
Dim WithEvents SerialPort como nuevo IO. Ports.SerialPort ' declarar puerto serie
Público Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer) ' para los Estados de sueño
InPacket(0 To 2000) público como Byte ' bug con serial.write cadenas como chr(255) no salen
OutPacket(0 To 50) público como Byte ' envían generalmente solamente unos pocos bytes aunque así podría hacerlo más pequeño
Privada Sub Initialise_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) maneja Initialise.Click
' inicializar
' enviar una U a la velocidad en baudios seleccionada baudios tasa al inicializar
Tratar de
SerialPort.PortName = "COM1"
SerialPort.BaudRate = "38400" ' 38400
SerialPort.Parity = IO. Ports.Parity.None ' sin paridad
SerialPort.DataBits = 8 ' 8 bits
SerialPort.StopBits = IO. Ports.StopBits.One ' bits de parada
SerialPort.ReadTimeout = 1000' milisegundos tan tiempo en 1 segundo si no hay respuesta
SerialPort.Open() ' abrir el puerto
SerialPort.DiscardInBuffer() ' borrar el búfer de entrada
OutPacket(0) = Strings.Asc("U") ' enviar un y esto fija la tasa de baudios
SerialPort.Write (OutPacket, 0, 1) ' enviar datos en el array outpacket Inicio en 0 con 1 byte
Sleep(100) ' esperar respuesta
SerialPort.Read (InPacket, 0, 1) ' leer detrás de 1 byte, debe ser 06
SerialPort.Close()
Captura como excepción
MsgBox ("Error apertura port serial - es otro programa mediante COM1?")
SerialPort.Close()
Prueba final
Si InPacket(0) = 6 entonces
TextBox1.Text += "Initialised" + vbCrLf ' éxito
Otra cosa
TextBox1.Text += "Error de inicialización" + vbCrLf ' dejar de
End If
End Sub
Privada Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) maneja Button2.Click
' apagar el programa - Asegúrese de que está cerrado el puerto serie
SerialPort.Close()
Final
End Sub
Privada Sub ReadFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) maneja ReadFile.Click
' volver leer un archivo
' nombre de archivo está en el cuadro de texto en el formato de nombre de archivo. TXT donde nombre es 1 a 8 caracteres y extensión es de 3 caracteres
Dim nombre de archivo como cadena
Dim LengthFilename como entero
Dim te como entero
Dim j como entero
Dim contador como enteros
BytesToRead DIM como entero
Dim Filesize como largo ' tamaño del archivo a leer hacia atrás
PacketSize DIM como entero
Dim paquetes como largo ' número de paquetes
Atenuar resto como mucho ' resto
Dim Readarray(50000) como Byte ' array para leer los datos en
Dim Readcounter como mucho ' contador para el readarray
Readcounter = 0' reiniciar el contador para el readarray
PacketSize = 10' uso 10 como conveniente para picaxe
Nombre de archivo = TextBox2.Text ' nombre del archivo a leer
LengthFilename = Strings.Len(Filename) ' longitud de este archivo
OutPacket(0) = Strings.Asc ("' comando para leer
OutPacket(1) = Strings.Asc("a")
OutPacket(2) = PacketSize ' consigue en bloques de números bytes
Contador = 3' incremento contador
Para i = 1 To LengthFilename ' Enviar archivo
OutPacket(Counter) = Strings.Asc (Strings.Mid (nombre de archivo, i, 1))
Contador = contador + 1
Siguiente
OutPacket(Counter) = 0' string null para terminar
Contador = contador + 1' uno bytes más
SerialPort.Open() ' abrir el puerto serie
SerialPort.Write (OutPacket, 0, contador) ' enviar datos en el array outpacket Inicio en 0
Sleep(100) ' esperar respuesta
¿BytesToRead = SerialPort.BytesToRead ' cuántos bytes en el buffer? Debe ser 4
SerialPort.Read (InPacket, 0, BytesToRead) ' leer en
' obtener el tamaño del archivo en bytes, msb primeros, 4 bytes
Tamaño de archivo = InPacket(0) * 16777216 + InPacket(1) * 65536 + InPacket(2) * 256 + InPacket(3)
Tamaño de archivo = Filesize + 1' número de bytes más hay un < ack > en el extremo
Contador = 0' reiniciar el contador
Paquetes = Filesize \ PacketSize ' División de enteros
Resto = Filesize Mod PacketSize ' y resto de izquierda sobre
Para i = 0 a paquetes - 1' conseguir los números bloques de datos
OutPacket(0) = 6' ack
SerialPort.Write (OutPacket, 0, 1) ' solicitar un bloque de
Sleep(100) ' corto retardo
SerialPort.Read (InPacket, 0, PacketSize) ' leer de nuevo un bloque
Para j = 0 To PacketSize - 1' la tienda en una matriz
Readarray(Readcounter) = InPacket(j)
Readcounter += 1' Añadir 1 al readcounter
Siguiente
Siguiente
' ahora conseguir el resto
OutPacket(0) = 6' ack
SerialPort.Write (OutPacket, 0, 1) ' solicitar un bloque de
Sleep(100) ' esperar a volver
SerialPort.Read (InPacket, 0, resto) ' leer el resto de bytes, debe ser ultima 06
Para j = 0 para el resto - 1' la tienda en una matriz
Readarray(Readcounter) = InPacket(j)
Readcounter += 1' Añadir 1 al readcounter
Siguiente
' impresión de un mensaje para decir si funciono o no, es decir, es el último carácter = 06
Si Readarray (Readcounter - 1) = 6 Then
TextBox1.Text += vbCrLf + "Leer el éxito" + vbCrLf
Otra cosa
TextBox1.Text += vbCrLf + "Read error" + vbCrLf
End If
' si el archivo actual es 4 bytes de longitud y ahora es un < ack > al final
' = 5 bytes y el último hace que readcounter += 1 readcounter = 6
' así que recortar y hacer la readcounter correcta
Readcounter = Readcounter - 1' ahora va ser = a 4
Readarray(Readcounter) = 0 ' borrar el ack (suponga que vino a través, debe tener)
SerialPort.Close() ' cerrar el puerto serie
«vb.net prueba código: imprimir el archivo en un cuadro de texto
Para i = 0 To Readcounter - 1
TextBox1.Text += Strings.Chr(Readarray(i))
Siguiente
End Sub
Privada Sub Dir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) maneja Dir.Click
Dim DirBytes como entero
Dim te como entero
OutPacket(0) = Strings.Asc ("' comando para leer
OutPacket(1) = Strings.Asc("d") ' directorio
OutPacket(2) = Strings.Asc("*") ' conseguir todos
OutPacket(3) = 0' cero para poner fin a
SerialPort.Open() ' abrir el puerto serie
SerialPort.Write (OutPacket, 0, 4) ' enviar datos en matriz outpacket desde
Sleep(2000) ' esperar un rato, volcados grandes tardan mucho tiempo (o encuesta a la entrada)
DirBytes = SerialPort.BytesToRead ' número de bytes a leer hacia atrás
SerialPort.Read (InPacket, 0, DirBytes)
SerialPort.Close()
' Mostrar
TextBox1.Text += vbCrLf
Para i = 0 a DirBytes - 2' -1 y luego 1 menos para el ack final
Si InPacket(i) <> 10 entonces ' 10 es el delimitador en la lista
TextBox1.Text += Strings.Chr(InPacket(i))
Otra cosa
' reemplazar con una nueva línea
TextBox1.Text += vbCrLf
End If
Siguiente
End Sub
Privada Sub Era_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) maneja Era.Click
Dim nombre de archivo como cadena
Dim LengthFilename como entero
Dim te como entero
Dim contador como enteros
Nombre de archivo = TextBox3.Text
LengthFilename = Strings.Len(Filename)
OutPacket(0) = Strings.Asc ("
OutPacket(1) = Strings.Asc("e") ' borrar
contador = 2
Para i = 1 To LengthFilename ' Enviar archivo
OutPacket(Counter) = Strings.Asc (Strings.Mid (nombre de archivo, i, 1))
Contador = contador + 1
Siguiente
OutPacket(Counter) = 0' string null para terminar
Contador += 1
SerialPort.Open() ' abrir el puerto serie
SerialPort.Write (OutPacket, 0, contador) ' enviar datos en el array outpacket Inicio en 0
Sleep(100) ' esperar respuesta
SerialPort.Read (InPacket, 0, 1) ' reconoce
Si InPacket(0) = 6 entonces
TextBox1.Text += "Erase el éxito" + vbCrLf ' éxito
Otra cosa
TextBox1.Text += "Borrar error" + vbCrLf ' dejar de
End If
SerialPort.Close()
End Sub
Privada Sub Writefile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) maneja Writefile.Click
Dim de memoria As String ' conveniente para almacenar una cadena de pruebas
Dim Filearray(1000) como Byte ' con arreglos de discos para el archivo
Dim FileLength mientras
PacketSize DIM como entero
Dim te como entero
Dim j como entero
Dim nombre de archivo como cadena
Dim paquetes mientras
Dim PacketRemainder como entero
Dim FileCounter como tiempo
FileCounter = 0
Nombre de archivo = TextBox5.Text ' nombre de archivo para guardar
Memoria = TextBox4.Text ' estos datos normalmente vendría desde otro lugar
PacketSize = 10
FileLength = Strings.Len(Filestring)
' mover la cadena en la matriz. (Esta cadena es simplemente una conveniencia para pruebas)
Para i = 1 para FileLength
Filearray (i - 1) = Strings.Asc (Strings.Mid (memoria, i, 1)) ' convertir a valor ascii
Siguiente
' archivo está listo para la salida
OutPacket(0) = Strings.Asc ("' comando
OutPacket(1) = Strings.Asc("t") ' escribir
OutPacket(2) = PacketSize ' tamaño de paquetes 0-50, el nuevo archivo (no añadir modo)
SerialPort.Open() ' abrir el puerto serie
SerialPort.Write (OutPacket, 0, 3) ' enviar datos en el array outpacket Inicio en 0
Para i = 1 To Strings.Len(Filename) ' enviar el nombre del archivo
OutPacket(0) = Strings.Asc (Strings.Mid (nombre de archivo, i, 1))
SerialPort.Write (OutPacket, 0, 1) ' enviar byte que
Siguiente
OutPacket(0) = 0
SerialPort.Write (OutPacket, 0, 1) ' enviar una cadena null para terminar
' ahora enviar 4 bytes para la longitud del archivo
OutPacket(0) = FileLength \ 16777216' división entera
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 65536' división entera
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength \ 256' división entera
SerialPort.Write (OutPacket, 0, 1)
OutPacket(0) = FileLength Mod 256' resto
SerialPort.Write (OutPacket, 0, 1)
Sleep(100) ' espera para reconocer
SerialPort.Read (InPacket, 0, 1) ' debe ser 06
Si InPacket(0) <> 6 entonces
TextBox1.Text += "Error con la primera lectura"
End If
' enviar los datos en grupos packetsize
Paquetes = FileLength \ PacketSize ' División de enteros
PacketRemainder = FileLength Mod PacketSize
Para i = 1 a paquetes
Para j = 1 To PacketSize
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Siguiente
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Si InPacket(0) <> 6 entonces
TextBox1.Text += "Error con el paquete"
End If
Siguiente
' ahora enviar el resto si es que existe
Si PacketRemainder <> 0 entonces
Para j = 1 To PacketRemainder
OutPacket(0) = Filearray(FileCounter)
SerialPort.Write (OutPacket, 0, 1)
FileCounter = FileCounter + 1
Siguiente
Sleep(100)
SerialPort.Read (InPacket, 0, 1)
Si InPacket(0) <> 6 entonces
TextBox1.Text += "Error de escritura el último paquete"
End If
End If
SerialPort.Close()
End Sub
Fin clase