Ho un'app di prova WPF per valutare la comunicazione della porta seriale basata su eventi (rispetto al polling della porta seriale). Il problema è che l'evento DataReceived non sembra affatto sparare.Data SerialPort DataReceived evento non attivato
Ho un modulo WPF molto semplice con un TextBox per l'input dell'utente, un TextBlock per l'output e un pulsante per scrivere l'input sulla porta seriale.
Ecco il codice:
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);
}
}
Ora, qui ci sono i fattori di complicazione:
Il computer portatile su cui sto lavorando non ha porte seriali, quindi sto utilizzando un pezzo di software chiamato Virtual Serial Port Emulator per configurare una COM2. VSPE ha funzionato egregiamente in passato, e non è chiaro il motivo per cui si guasterebbe solo con la classe SerialPort di .NET, ma ne parlo per ogni evenienza.
Quando si preme il pulsante del modulo per inviare i dati, la finestra di Hyperterminal (collegata a COM2) indica che i dati stanno passando. Sì, disconnetto Hyperterminal quando voglio testare la capacità del mio modulo di leggere la porta.
Ho provato ad aprire la porta prima di collegare l'evento. Nessun cambiamento.
Ho letto un altro post qui dove qualcun altro ha riscontrato un problema simile. Nessuna di queste informazioni mi ha aiutato in questo caso.
EDIT:
Ecco la versione console (modificato da 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);
}
}
Questo dovrebbe eliminare qualsiasi preoccupazione che si tratta di un problema di threading (credo). Questo non funziona neanche. Anche in questo caso, Hyperterminal riporta i dati inviati attraverso la porta, ma l'app della console non sembra attivare l'evento DataReceived.
EDIT # 2:
mi sono reso conto che avevo due applicazioni separate che dovrebbero inviare e ricevere dalla porta seriale, così ho deciso di provare a loro in esecuzione contemporaneamente ...
Se io digitare nell'app della console, l'evento DataReceived dell'app WPF si attiva, con l'errore di thread previsto (che so come gestire).
Se si digita nell'app WPF, l'evento DataReceived dell'app della console viene attivato e riecheggia i dati.
Immagino che il problema sia da qualche parte nel mio utilizzo del software VSPE, che è configurato per il trattamento di una porta seriale come input e output. E attraverso alcune stranezze della classe SerialPort, un'istanza di una porta seriale non può essere sia il mittente che il destinatario. Ad ogni modo, penso che sia risolto.
Vedere la versione della console in alto. Senza fortuna. – Klay