Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 6 Diciembre 2023, 22:37 pm



Título: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: Meta en 6 Diciembre 2023, 22:37 pm
Hola:

En este código me sale un error y no se como corregirlo, ya que me interesa mostrar datos en pantalla y no me sale.

Ver error (https://i.postimg.cc/0NF43JXt/aaaaaaaa.jpg).

Código hecho hasta ahora.
Código
  1. using System;
  2. using System.IO.Ports;
  3.  
  4. namespace Almacenar_byte_puerto_serie_Consola_01
  5. {
  6.    internal class Program
  7.    {
  8.        static SerialPort puertoSerie;
  9.        static byte[] datoRecibido;
  10.        static void Main(string[] args)
  11.        {
  12.            #region Configuración ventana.
  13.            // Título de la ventana.
  14.            Console.Title = "Almacenar byte[] desde el puerto serie.";
  15.  
  16.            // Tamaño de la ventana, x, y, o ancho y alto.
  17.            const byte ANCHO_X = 70, ALTO_Y = 25;
  18.            Console.SetWindowSize(ANCHO_X, ALTO_Y);
  19.  
  20.            // Color de fondo.
  21.            Console.BackgroundColor = ConsoleColor.Black;
  22.  
  23.            // Color de las letras.
  24.            Console.ForegroundColor = ConsoleColor.Yellow;
  25.  
  26.            // Limpiar pantalla y dejarlo todo en color de fondo.
  27.            Console.Clear();
  28.  
  29.            // Visible el cursor.
  30.            Console.CursorVisible = true;
  31.            #endregion
  32.  
  33.            puertoSerie = new SerialPort()
  34.            {
  35.                // Configuración del puerto serie.
  36.                PortName = "COM4",           // Nombre del puerto serie.
  37.                BaudRate = 2400,             // Velocidad en baudios.
  38.                Parity = Parity.None,        // Esquema para comprobar la paridad de cada byte recibido.
  39.                StopBits = StopBits.One,     // Número de bits de parada por byte.
  40.                DataBits = 8,                // Número de bits de datos por byte.
  41.                Handshake = Handshake.None,  // Protocolo de establecimiento.
  42.                DtrEnable = true,            // Línea de terminal de datos.
  43.                RtsEnable = true,            // Línea de solicitud.
  44.  
  45.                // Establecer los tiempos de espera de lectura / escritura.
  46.                ReadTimeout = 500,           // Tiempo de espera de escritura en ms.
  47.                WriteTimeout = 500,          // Tiempo de espera de escritura en ms.
  48.  
  49.                // Más configuraciones.
  50.                DiscardNull = false,         // Descartar bytes nulos recibidos.
  51.                ParityReplace = 63,          // Reemplaza los bytes recibidos con errores de paridad.
  52.                ReadBufferSize = 4096,       // Tamaño del búfer de lectura en bytes.
  53.                WriteBufferSize = 2018,      // Tamaño del búfer de escritura en bytes.
  54.                ReceivedBytesThreshold = 1   // Número de bytes que se necesitan.
  55.            };
  56.  
  57.            puertoSerie.DataReceived += SerialPort_DataReceived;
  58.            puertoSerie.Open();
  59.  
  60.            Console.WriteLine("Presiona cualquier tecla para detener la captura...");
  61.            Console.ReadKey();
  62.  
  63.            puertoSerie.Close();
  64.  
  65.            Console.WriteLine("Datos recibidos:");
  66.            MostrarBytes(datoRecibido);
  67.        }
  68.        static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
  69.        {
  70.            SerialPort sp = (SerialPort)sender;
  71.            int bytesToRead = sp.BytesToRead;
  72.            byte[] buffer = new byte[bytesToRead];
  73.            sp.Read(buffer, 0, bytesToRead);
  74.  
  75.            if (datoRecibido == null)
  76.            {
  77.                datoRecibido = buffer;
  78.            }
  79.            else
  80.            {
  81.                Array.Resize(ref datoRecibido, datoRecibido.Length + bytesToRead);
  82.                Array.Copy(buffer, 0, datoRecibido, datoRecibido.Length - bytesToRead, bytesToRead);
  83.            }
  84.        }
  85.  
  86.        static void MostrarBytes(byte[] dato)
  87.        {
  88.            for (int i = 0; i < dato.Length; i++)
  89.            {
  90.                Console.Write($"{dato[i]} ");
  91.            }
  92.            Console.WriteLine();
  93.        }
  94.    }
  95. }

Se trata de obtener bytes puro y duro desde el RS232 o puerto serie, almacenarlo en un array tipo byte[] y mostrarlo en pantalla.

¿Alguna idea?

Saludos.


Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: **Aincrad** en 6 Diciembre 2023, 23:53 pm
No se si te equivocaste al publicar la imagen del error, por que en el titulo dices un error pero en la imagen sale otro.

referente al error del la imagen, se ve que tienes un array llamado "numeros" y tienes 6 items (del 0 al 5, siendo el index 5 el maximo de ese array) , pero tu estas consultando un index : "6" el cual no existe en ese array.

Puedes solucionarlo de la siguiente manera:

1) Revisar si tal index existe en ese array y si no existe (es tu caso) , no mostrarlo en el richtexbox.

por cierto note que estas dentro de un Foreach y incrementas la variable "contador", osea que si la variable contador se incrementa a 10 por ejemplo, y tu array "numeros" tiene solo 5 items (del 0 al 4 en index), tendras puros errores. por que ese index no existe en tu array.


Esto es referente a lo mostrado en la imagen que subiste.





Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: Meta en 7 Diciembre 2023, 23:37 pm
Me equivoqué. La captura es esta:

(https://i.postimg.cc/vHpN4ZF4/ERROR.jpg)

Ver zoom (https://i.postimg.cc/vHpN4ZF4/ERROR.jpg).

Disculpen.


Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: soyloqbuskas en 9 Diciembre 2023, 04:25 am
Buenas.

Creo que el problema esta en que el objeto dato no existe porque en el codigo lo has llamado datoRecibido. Reemplaza dato.length por datosRecibidos.length.

Un saludo.


Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: **Aincrad** en 9 Diciembre 2023, 17:05 pm
Me equivoqué. La captura es esta:

(https://i.postimg.cc/vHpN4ZF4/ERROR.jpg)

Ver zoom (https://i.postimg.cc/vHpN4ZF4/ERROR.jpg).

Disculpen.

eso es por que el array de byte "dato" esta vacio, osea error no lo tienes en esa funcion "MostrarBytes" , el error lo tienes en lo que esta llamando a esa funcion, osea basicamente estas llamando esa funcion pero con un array vacio.

puedes solucionarlo de dos maneras :

1) ver por que le estas mandando un array vacio , en tu codigo. osea hay en dato recibido, no recibe nada y la variable queda vacia :

(https://i.postimg.cc/rp4K3jCY/Captura-de-pantalla-2023-12-09-120547.png)

2) verifica si el array esta vacio , por ejemplo, Agrega esto a la funcion MostrarBytes:

Código
  1. If (dato == null) { return; }



Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: Danielㅤ en 9 Diciembre 2023, 19:20 pm
Hola, a tener en cuenta es que cuando se necesita saber si una variable tiene el valor vacío, hay dos formas de comprobarlo que no son iguales, aqui un ejemplo:

Código
  1. If (dato == null) { return null; }

Código
  1. If (dato == "") { return ""; }

La primera comprobación devuelve null siendo una variable sin contenido y del tipo null mientras que la segunda es una variable también sin contenido/datos pero es del tipo string, aunque las dos son variables vacías pero de distintos tipos.


Saludos


Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: Meta en 13 Diciembre 2023, 21:48 pm
Me ejecuta pero en pantalla no me muestra nada a la hora de enviar tramas de bytes para ver si lo capta. Si no hay nada, que también indique algo para saberlo.


Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: Serapis en 23 Diciembre 2023, 22:51 pm
Creo que el problema esta en que el objeto dato no existe porque en el codigo lo has llamado datoRecibido. Reemplaza dato.length por datosRecibidos.length.
Esa es una posibilidad... lo que puede haber sucedido es que cambiaste el nombre al array antes de crear ese bucle y luego al teclear escribiste el nombre que tenía previamente el array.

 la otra posibilidad es que 'dato', sea un array que se reciba por referencia,  y por tanto es un array que debe crear y rellenar la función llamada, y que en ese caso no parece ser así.  Revisa la función llamada. Si cabe la posibilidad de que la función pueda entregar el array nulo, usa un buleano en la devolución de la función, para omitir el bucle, cuando devuelva false...


Título: Re: ERROR: Referencia a objeto no establecida como instancia de un objeto.
Publicado por: Meta en 25 Diciembre 2023, 08:17 am
La idea del programa es almacenar los bytes recibidos y mostrarlo en pantalla.

Si no ha llegado nada, que diga que no hay nada con un mensaje.