0 votos

¿Cómo capturar tramas de bytes puro de un puerto serie?

Hola:

Quiero capturar datos tal cual como viene en el puerto serie RS232 y almacenarlo me imagino que será en una matriz o array como este: byte[]

Tipo string sería así:

string datosRecibidos:

Tipo string no interesa, porque me puede llegar datos que no son legibles. Me puede llegar datos tipo de solo comportamiento como retorno de carro, salto de línea, etc. Todos los byte quiero verlos almacenados en una variable tipo byte[].

Después mostrarlo en decimal algo parecido a esto:

35 73 50 50 49 46 56 79 50 50 50 46 50 76 48 49 49 66 49 48 48 86 50 54 46 48 7 0 53 48 46 51 72 53 48 46 51 82 48 48 51 56 83 144 132 128 136 132 192 13

1voto

Jimmy Neutron Puntos 500

Para capturar tramas de bytes puro de un puerto serie en C#, puedes utilizar la clase SerialPort del espacio de nombres System.IO.Ports. Aquí te muestro un ejemplo de cómo hacerlo:

using System;
using System.IO.Ports;

public class SerialPortExample
{
    static SerialPort serialPort;
    static byte[] receivedData;

    public static void Main()
    {
        serialPort = new SerialPort("COM1", 9600); // Cambia "COM1" por el puerto serie que estés utilizando y 9600 por la velocidad de baudios que corresponda
        serialPort.DataReceived += SerialPort_DataReceived;
        serialPort.Open();

        Console.WriteLine("Presiona cualquier tecla para detener la captura...");
        Console.ReadKey();

        serialPort.Close();

        Console.WriteLine("Datos recibidos:");
        PrintBytes(receivedData);
    }

    static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        int bytesToRead = sp.BytesToRead;
        byte[] buffer = new byte[bytesToRead];
        sp.Read(buffer, 0, bytesToRead);

        if (receivedData == null)
        {
            receivedData = buffer;
        }
        else
        {
            Array.Resize(ref receivedData, receivedData.Length + bytesToRead);
            Array.Copy(buffer, 0, receivedData, receivedData.Length - bytesToRead, bytesToRead);
        }
    }

    static void PrintBytes(byte[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            Console.Write($"{data[i]} ");
        }
        Console.WriteLine();
    }
}

En este ejemplo, se crea una instancia de SerialPort con el nombre del puerto serie y la velocidad de baudios correspondiente. Luego, se suscribe al evento DataReceived que se dispara cada vez que se reciben datos en el puerto serie. Dentro del evento, se lee el buffer de recepción y se almacena en la variable receivedData. Al finalizar la captura, se muestra en consola los bytes recibidos.

Recuerda cambiar "COM1" por el puerto serie que estés utilizando y 9600 por la velocidad de baudios correcta para tu caso.

0 votos

Hola: Me muestra este error: System.NullReferenceException: 'Referencia a objeto no establecida como instancia de un objeto.' Desde que pulse Enter sale el error y nunca aparece nada en pantalla. Ver imagen: https://i.postimg.cc/QCLfw2JK/ERROR.jpg Saludos.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X