Saltar al contenido

¿Cómo uso el evento dataReceived del objeto de puerto SerialPort en C #?

Solución:

Creo que tu problema es la línea:**

sp.DataReceived + = port_OnReceiveDatazz;

¿No debería ser?

sp.DataReceived + = new SerialDataReceivedEventHandler (port_OnReceiveDatazz);

** No importa, la sintaxis está bien (no me di cuenta del atajo en el momento en que respondí originalmente esta pregunta).

También he visto sugerencias de que debe activar las siguientes opciones para su puerto serie:

sp.DtrEnable = true;    // Data-terminal-ready
sp.RtsEnable = true;    // Request-to-send

También puede que tenga que establecer el protocolo de enlace en RequestToSend (a través de la enumeración del protocolo de enlace).


ACTUALIZAR:

Encontré una sugerencia que dice que primero debe abrir su puerto y luego asignar el controlador de eventos. ¿Quizás es un error?

Entonces en lugar de esto:

sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);
sp.Open();

Hacer esto:

sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);

Déjame saber cómo te va.

En primer lugar, le recomiendo que use el siguiente constructor en lugar del que usa actualmente:

new SerialPort("COM10", 115200, Parity.None, 8, StopBits.One);

A continuación, debería eliminar este código:

// Wait 10 Seconds for data...
for (int i = 0; i < 1000; i++)
{
    Thread.Sleep(10);
    Console.WriteLine(sp.Read(buf,0,bufSize)); //prints data directly to the Console
}

Y en su lugar, simplemente repita hasta que el usuario presione una tecla o algo, así:

namespace serialPortCollection
{   class Program
    {
        static void Main(string[] args)
        {
            SerialPort sp = new SerialPort("COM10", 115200);
            sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler

            sp.Open();
            sp.WriteLine("$"); //Command to start Data Stream

            Console.ReadLine();

            sp.WriteLine("!"); //Stop Data Stream Command
            sp.Close();
        }

       // My Event Handler Method
        private static void port_OnReceiveDatazz(object sender, 
                                   SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort) sender;
            byte[] buf = new byte[spL.BytesToRead];
            Console.WriteLine("DATA RECEIVED!");
            spL.Read(buf, 0, buf.Length);
            foreach (Byte b in buf)
            {
                Console.Write(b.ToString());
            }
            Console.WriteLine();
        }
    }
}

Además, tenga en cuenta las revisiones del controlador de eventos de datos recibidos, en realidad debería imprimir el búfer ahora.

ACTUALIZACIÓN 1


Acabo de ejecutar el siguiente código con éxito en mi máquina (usando un cable de módem nulo entre COM33 y COM34)

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread writeThread = new Thread(new ThreadStart(WriteThread));
            SerialPort sp = new SerialPort("COM33", 115200, Parity.None, 8, StopBits.One);
            sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler

            sp.Open();
            sp.WriteLine("$"); //Command to start Data Stream

            writeThread.Start();

            Console.ReadLine();

            sp.WriteLine("!"); //Stop Data Stream Command
            sp.Close();
        }

        private static void port_OnReceiveDatazz(object sender, 
                                   SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort) sender;
            byte[] buf = new byte[spL.BytesToRead];
            Console.WriteLine("DATA RECEIVED!");
            spL.Read(buf, 0, buf.Length);
            foreach (Byte b in buf)
            {
                Console.Write(b.ToString() + " ");
            }
            Console.WriteLine();
        }

        private static void WriteThread()
        {
            SerialPort sp2 = new SerialPort("COM34", 115200, Parity.None, 8, StopBits.One);
            sp2.Open();
            byte[] buf = new byte[100];
            for (byte i = 0; i < 100; i++)
            {
                buf[i] = i;
            }
            sp2.Write(buf, 0, buf.Length);
            sp2.Close();
        }
    }
}

ACTUALIZACIÓN 2


Dado todo el tráfico sobre esta cuestión recientemente. Empiezo a sospechar que su puerto serie no está configurado correctamente o que el dispositivo no responde.

Le recomiendo que intente comunicarse con el dispositivo utilizando otros medios (yo uso hyperterminal con frecuencia). Luego puede jugar con todas estas configuraciones (tasa de bits, paridad, bits de datos, bits de parada, control de flujo) hasta que encuentre el conjunto que funcione. La documentación del dispositivo también debe especificar estos ajustes. Una vez que los descubrí, me aseguraría de que mi .NET SerialPort esté configurado correctamente para usar esas configuraciones.

Algunos consejos para configurar el puerto serie:

Tenga en cuenta que cuando dije que debería usar el siguiente constructor, quise decir que use esa función, ¡no necesariamente esos parámetros! Debe completar los parámetros de su dispositivo, las configuraciones a continuación son comunes, pero pueden ser diferentes para su dispositivo.

new SerialPort("COM10", 115200, Parity.None, 8, StopBits.One);

También es importante que configure .NET SerialPort para usar el mismo control de flujo que su dispositivo (como otras personas han dicho anteriormente). Puedes encontrar más información aquí:

http://www.lammertbies.nl/comm/info/RS-232_flow_control.html

Estaba teniendo el mismo problema con un módem que había funcionado anteriormente y luego un día simplemente dejó de generar el evento DataReceived.

La solución en mi caso, de forma muy aleatoria, fue habilitar RTS, por ejemplo

sp.RtsEnable = true;

No tengo idea de por qué funcionó en este kit en particular (en realidad no es un hombre de comunicaciones), ni por qué funcionó y luego se detuvo, pero puede ayudar a alguien más algún día, así que publíquelo por si acaso …

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *