Zdarzenie .NET SerialPort DataReceived nie zostało uruchomione
Mam aplikację testową WPF, aby ocenić komunikację zdarzeń portu szeregowego (w porównaniu do badania portu szeregowego). Problem polega na tym, że wydarzenie Datareceped w ogóle nie działa.
Mam bardzo prosty formularz WPF z TextBox do wprowadzania danych przez użytkownika, TextBlock do wyjścia i przyciskiem do zapisywania danych wejściowych do portu szeregowego.
Oto kod:
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);
}
}
Więc oto czynniki komplikujące:
- Laptop, nad którym pracuję, nie ma portów szeregowych, więc używam oprogramowania o nazwie Virtual Serial Port Emulator do konfiguracji COM2. VSPE działało dobrze w przeszłości i nie jest jasne, dlaczego miałoby działać tylko z klasą .NET SerialPort, ale wspominam o tym na wszelki wypadek.
- Kiedy klikam przycisk w moim formularzu, aby przesłać dane, okno programu HyperTerminal (połączone z portem COM2) pokazuje, że dane są przetwarzane. Tak, wyłączam program hyperterminal, gdy chcę przetestować zdolność mojego formularza do odczytu portu.
- Próbowałem otworzyć port przed podłączeniem zdarzenia. Bez zmian.
Przeczytałem tutaj kolejny post, w którym ktoś inny ma podobny problem. Żadna z tych informacji nie pomogła mi w tej sprawie.
EDIT
:
Oto wersja konsoli (zmieniona z
http://mark.michaelis.net/Blog ... Port. aspx
http://mark.michaelis.net/Blog ... .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);
}
}
Powinno to usunąć wszelkie obawy, że jest to problem z przesyłaniem strumieniowym (myślę). To też nie działa. Ponownie Hyperterminal zgłasza dane przesłane przez port, ale aplikacja konsoli nie wydaje się uruchamiać zdarzenia DataReceived.
EDIT #2:
Zdałem sobie sprawę, że mam dwie osobne aplikacje, które muszą jednocześnie wysyłać i odbierać z portu szeregowego, więc postanowiłem spróbować uruchomić je w tym samym czasie ...
Jeśli wpiszę aplikację konsolową, zdarzenie DataReceived aplikacji WPF zostanie wyzwolone z oczekiwanym błędem przesyłania strumieniowego (z którym wiem, jak sobie radzić).
Jeśli wpiszę aplikację WPF, zdarzenie aplikacji konsoli DataReceived jest wyzwalane i powtarza dane.
Myślę, że problem leży gdzieś w używaniu oprogramowania VSPE, które jest skonfigurowane do obsługi pojedynczego portu szeregowego zarówno dla wejścia, jak i wyjścia. Ze względu na dziwne cechy klasy SerialPort, pojedyncza instancja portu szeregowego nie może być jednocześnie nadawcą i odbiorcą. W każdym razie myślę, że problem został rozwiązany.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
9 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
To rozwiązało problem dla mnie, flaga DataTransmitReady nie była włączona, więc żadne dane nie zostały odebrane.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Oto dlaczego moje wstępne stwierdzenie wygląda następująco:
Oddzieliłem metody open port i close port, ponieważ często sprawdzam, czy plik com.
Na koniec upewnij się, że twój sterownik portu wirtualnego Com jest poprawnie zainstalowany i że używasz właściwego portu, funkcja plug and play nie była wystarczająca dla mojej karty. Jeśli chcesz stworzyć jakąś kontrolę, która pozwoli ci wybrać porty dostępne w czasie wykonywania, poniższe polecenie da ci dostępne porty:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Wydaje mi się, że był to problem z modelem STA, ponieważ przeniesienie go do aplikacji konsolowej zostało dość naprawione.
Anonimowy użytkownik
Potwierdzenie od:
Dave.
https://stackoverflow.com/users/34796/dave-swersky
Powolny, może to być problem z strumieniowo, zwłaszcza jeśli używasz .NET 4.0 lub nowszego.
W programie .NET 4.0 program obsługi zdarzeń działa w puli wątków iw pewnych okolicznościach może wystąpić znaczne opóźnienie, zanim to nastąpi. (W moim kodzie, który działał dobrze pod .NET 2.0, problemy zostały zauważone zaraz po uaktualnieniu do .NET 4.5. Program obsługi zdarzeń często uruchamiał się znacznie później, niż oczekiwano, a czasami w ogóle nie działał!)
Połączenie http://msdn.microsoft.com/en-u ... .aspx
przy wysokiej wartości dla wątków uzupełniających problem znikał tak szybko, jak się pojawił. W kontekście naszej aplikacji wystarczył . Na maszynach, na których zaobserwowano problem, wartości domyślne (uzyskane przez wywołanie http://msdn.microsoft.com/en-u ... s.aspx) były równe 2.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Moje rozwiązanie było
Kasować
McAfee Antivirus i wszystko, co jest z nim związane. Kiedy zobaczyłem magazyny McAfee, mieli rekordy na temat zatrzymywania strumieni, a ja zasugerowałem, że serialdatareceteDeventhandler () działa w strumieniu.
Mam nadzieję, że to rozwiązanie zadziała dla Ciebie. Z poważaniem.
Anonimowy użytkownik
Potwierdzenie od:
Wynik:
Otrzymane dane:
cześć wszystkim
Naciśnij dowolny klawisz, aby kontynuować ...