none
Como mandar un archivo por el puero serial? RRS feed

  • Pregunta

  • Hola buen dia,

    Estoy intentando mandar un archivo por el puerto serial o como1, se como abrir el puerto y madnar una cadena, preo lo que necesito es mandar un archivo, el tipo de archivos que necesito mandar no pensa mucho  100 kb el mas grande, son archivos del tipo .nxf, espero me puedan ayudar, muchas gracias de antemano, saludos.

    kike

    lunes, 7 de diciembre de 2015 18:04

Todas las respuestas

  • Por un puerto serie no se puede mandar un archivo, solo se pueden enviar bytes. Será problema del periférico conectado al otro extremo el interpretar esos bytes debidamente y tratarlos como si fueran un archivo.

    Para convertir el archivo en bytes, simplemente usa System.IO.FIle.ReadAllBytes(archivo) y eso te devolverá en memoria todos los bytes del archivo. Después tendrás que re-codificarlos en el formato que espere el periférico al que se los vayas a enviar. Puede que los admita directamente en binario o que requiera alguna codificación específica, por ejemplo enviarlos en hexadecimal o codificados en base64. No hay forma de saberlo sin leer el manual del periférico al que vayan destinados. Una vez que los hayas convertido al formato adecuado, los vas enviando uno a uno a través del puerto usando la clase SerialPort, como indicas que ya sabes hacer.

    lunes, 7 de diciembre de 2015 18:40
  • Hola:

    Recuerdo que si se puede hacer con un truco. Antes que nada aquí un ejemplo del RS232 que puedes ver en este enlace.

    using System;
    using System.IO.Ports;
    
    class PortDataReceived
    {
        public static void Main()
        {
            SerialPort mySerialPort = new SerialPort("COM1");
    
            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;
    
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
            mySerialPort.Open();
    
            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadKey();
            mySerialPort.Close();
        }
    
        private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
            Console.Write(indata);
        }
    }

    Si activan el vídeo, lo explica aquí. No se el motivo de que lo hayan borrado o bloqueado.


    Te explico de que iba, aún lo recuerdo y tengo ejemplos hechos, de todas maneras haré un tutorias sobre ello en el futuro. Abres con un editor hexadecimal, en el cual usan este. Abres cualquier archivo, sea .exe, .zip, .jpg, .txt, el que sea, si es pequeño, mejor. Si es un .exe, el ativirus te puede saltar creyendo que es un virus, para que me entiendas, puedes guardar un ejecutable dentro de otro ejecutable en array de bits.Dicho array de guarda en una variable, aunque pese 100k.

    Esos 100k, puede ir muy lengo en el puerto serie, así que usa los máximos baudios permiditos entre dos dispositivos.

    Recuerdo que puse una foto de unos 3 MB, se pega mucho tiempo en pegar tantos bytes.

    1. Carga una foto por ejemplo en el efitor hexadecimal HxD gratuito.

    2. Selecciona todo el contenido.

    3.

    Creas con Visual C# aplicación de modo consola.

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; // No olvidar. using System.Diagnostics; namespace Byte_Hex_ocultos_2 { class Program { #region Byte Oculto. byte[] rawData = { 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0C, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0B, 0x0B, 0x09, 0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11, 0x0F, 0x11, 0x11, 0x13, 0x16, 0x1C, 0x17, 0x13, 0x14, 0x1A, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1A, 0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17, 0x22, 0x24, 0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F, 0x1E, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x0E, 0x08, 0x08, 0x0E, 0x1E, 0x14, 0x11, 0x14, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x02, 0x16, 0x03, 0x20, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1D, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x03, 0x04, 0x06, 0x07, 0x01, 0x00, 0x08, 0x09, 0xFF, 0xC4, 0x00, 0x50, 0x10, 0x00, 0x01, 0x03, 0x03, 0x03, 0x01, 0x06, 0x03, 0x05, 0x05, 0x05, 0x06, 0x01, 0x0A, 0x06, 0x03, 0x01, 0x02, 0x03, 0x04, 0x00, 0x05, 0x11, 0x06, 0x12, 0x21, 0x31, 0x07, 0x13, 0x22, 0x41, 0x51, 0x61, 0x14, 0x32, 0x71, 0x15, 0x23, 0x42, 0x81, 0x91, 0x08, 0x52, 0x62, 0xA1, 0xB1, 0x16, 0x24, 0x33, 0x72, 0xD1, 0x34, 0x43, 0x53, 0x82, 0x92, 0xC1, 0xE1, 0x17, 0x25, 0x35, 0x44, 0x63, 0x73, 0x83, 0x93, 0x94, 0xA2, 0x26, 0x45, 0x54, 0x55, 0x64, 0x74, 0x36, 0x84, 0xC2, 0xFF, 0xC4, 0x00, 0x1A, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xFF, 0xC4, 0x00, 0x28, 0x11, 0x00, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x02, 0x02, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0x03, 0x21, 0x12, 0x31, 0x04, 0x13, 0x41, 0x22, 0x51, 0x14, 0x32, 0x05, 0x42, 0x61, 0x15, 0x23, 0x71, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xD4, 0x70, 0x9C, 0xD3, 0xAC, 0xF0, 0x73, 0x4C, 0x67, 0xE9, 0x4A, 0x0B, 0xDA, 0x3A, 0xD7, 0xB6, 0x72, 0x13, 0xD2, 0xBC, 0x8A, 0x70, 0x72, 0x83, 0xF5, 0xA8, 0x6C, 0xB9, 0x90, 0x0D, 0x49, 0x42, 0xC7, 0x19, 0xE9, 0x52, 0xC0, 0xCF, 0x3B, 0x6D, 0x68, 0x84, 0xDB, 0xE6, 0x8F, 0xF7, 0x6B, 0x15, 0xA0, 0x58, 0x64, 0x07, 0xAC, 0xF1, 0x9C, 0x27, 0x25, 0x4D, 0x8F, 0xE9, 0x54, 0xBE, 0xD9, 0x92, 0xDB, 0xDA, 0x71, 0x29, 0x49, 0x21, 0x41, 0x40, 0x83, 0x8A, 0x27, 0xA3, 0x64, 0xCB, 0x3A, 0x62, 0x2A, 0x9B, 0x40, 0x7B, 0xBB, 0x48, 0x07, 0x69, 0xE6, 0xA4, 0x0B, 0x78, 0x29, 0x3E, 0xD4, 0x87, 0xD4, 0x12, 0xD9, 0xCA, 0xB8, 0xA1, 0x48, 0xBB, 0xEC, 0x73, 0xBB, 0x7E, 0x33, 0xA8, 0x27, 0x9C, 0xED, 0xE0, 0x54, 0x69, 0x37, 0x22, 0xB5, 0x63, 0xBD, 0xC2, 0x07, 0x5C, 0xE0, 0x55, 0x09, 0x13, 0x25, 0x97,

    // El archivo continua, lo he cortado porque no cabe en el foro por ser extenso, para aue lo sepas. }; #endregion static void Main(string[] args) { Console.Title = "Imagen oculto."; new Program(); } public Program() { Console.WriteLine("Escribiendo archivo desde el arreglo de bytes"); File.WriteAllBytes("fotón.jpg", rawData); string input = Console.ReadLine(); if ((input == "Yes") || (input == "Y") || (input == "y")) { Process.Start("fotón.jpg"); } else { Console.WriteLine("Saliendo..."); } } } }

    Este código de arriba solo te crea el archivo que es una foto metido en una variable. Si dices que si, lo abre y ves la foto. Es un ejemplo para que sepas guardar un archivo dentro de una variable. En realidad lo cargas también en un richTextBox, lo guardas en una variable y lo envías.

    Enviar este archivo si se puede, toca programar el puerto serie.

    El archivo lo puedes enviar así, codificado.

    private void button_b_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = Encoding.ASCII.GetBytes("Hello World");
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }

    Preferiblemnete, en butes como indica aquí.

    private void button_t_Click(object sender, EventArgs e)
    {
        byte[] mBuffer = new byte[5];
        mBuffer[0] = 0x74;
        mBuffer[1] = 0x75;
        mBuffer[2] = 0x89;
        mBuffer[3] = 0x20;
        mBuffer[4] = 0x6C;
        serialPort1.Write(mBuffer, 0, mBuffer.Length);
    }

    Ya es tu elección.

    Cuando pruebes el mini programa, me dices que foto haz visto, sabré si realmente te ha funcionado, ejjejej.

    El aparato Dev Drive de la época.

    Lo he comprado en su época de la PSx para guardar los datos de ma Memory  Card en el PC o ordenador de sobremesa, también volver a guardar archivos en esa memoria, todo por el puerto serie. Te digo que por el puerto serie, si se puede enviar archivos de todo tipo, pero a muy baja velocidad, no es un USB, pero poder se puede para que lo sepas y sin errores. El puerto serie no es para pasar una peli de 2 GB, podrís tardar meses en que llegue de un ordenador a otro. ;)

    El enlace del programa, está hecho con Visual Studio Community 2015. Lo he subido a dropBox.

    Descargar

    Un cordial saludo.

    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 8 de diciembre de 2015 0:58
    martes, 8 de diciembre de 2015 0:55