Tengo una aplicación de prueba WPF para evaluar la comunicación de puerto serie basada en eventos (frente al sondeo del puerto serie). El problema es que el evento DataReceived parece no estar funcionando en absoluto..NET SerialPort Evento DataReceived que no se activa
Tengo un formulario WPF muy básico con un TextBox para la entrada del usuario, un TextBlock para la salida, y un botón para escribir la entrada al puerto serie.
Aquí está el código:
public partial class Window1 : Window
{
SerialPort port;
public Window1()
{
InitializeComponent();
port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
port.DataReceived +=
new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Debug.Print("receiving!");
string data = port.ReadExisting();
Debug.Print(data);
outputText.Text = data;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Debug.Print("sending: " + inputText.Text);
port.WriteLine(inputText.Text);
}
}
Ahora, aquí están los factores que complican:
El portátil que estoy trabajando no tiene puertos serie, así que estoy usando un pedazo de software llamado Virtual Serial Port Emulator para configurar un COM2. VSPE ha trabajado admirablemente en el pasado, y no está claro por qué solo funcionaría mal con la clase SerialPort de .NET, pero lo menciono por las dudas.
Cuando pulso el botón en mi forma de enviar los datos, la ventana de mi Hiperterminal (conectado en COM2) muestra que los datos está llegando. Sí, desconecto Hyperterminal cuando quiero probar la capacidad de mi formulario para leer el puerto.
He intentado abrir el puerto antes de conectar el evento. Ningún cambio.
He leído otra publicación aquí donde alguien más está teniendo un problema similar. Nada de esa información me ha ayudado en este caso.
EDIT:
Aquí está la versión de la consola (modificado de http://mark.michaelis.net/Blog/TheBasicsOfSystemIOPortsSerialPort.aspx):
class Program
{
static SerialPort port;
static void Main(string[] args)
{
port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
port.DataReceived +=
new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
string text;
do
{
text = Console.ReadLine();
port.Write(text + "\r\n");
}
while (text.ToLower() != "q");
}
public static void port_DataReceived(object sender,
SerialDataReceivedEventArgs args)
{
string text = port.ReadExisting();
Console.WriteLine("received: " + text);
}
}
Esto debería eliminar cualquier preocupación de que se trata de una cuestión Threading (creo). Esto tampoco funciona. Una vez más, Hyperterminal informa los datos enviados a través del puerto, pero la aplicación de la consola no parece activar el evento DataReceived.
editar # 2:
me di cuenta que tenía dos aplicaciones separadas que se deben enviar y recibir desde el puerto serie, por lo que decidió intentar ejecutar de forma simultánea ...
Si yo escriba en la aplicación de la consola, se dispara el evento DataReceived de la aplicación WPF, con el error esperado de subprocesamiento (que sé cómo manejar).
Si escribo en la aplicación WPF, el evento DataReceived de la aplicación de consola se dispara y se hace eco de los datos.
Supongo que el problema está en alguna parte de mi uso del software VSPE, que está configurado para tratar un puerto serie como entrada y salida. Y a través de algunas rarezas de la clase SerialPort, una instancia de un puerto serie no puede ser tanto el emisor como el receptor. De todos modos, creo que está resuelto.
Consulte la versión de la consola anterior. Sin suerte. – Klay