wyświetlanie danych z portu usb jako text TextBoxu

0

Jestem nowy więc proszę o wyrozumiałość.
Chciałbym aby dane, które przychodzą za pomocą portu USB (sygnały) wyświetlały się w TextBoxie.
Źródłem danych jest zaprogramowane Arduino Leonardo. Działa to na zasadzie, jeżeli jest wciśnięty przycisk są wysyłane dane.
Dodam również, że w konsoli udało mi się uzyskać taki rezultat, ale nie wiem dlaczego nie mogę tego przypisać do TextBoxu.

        public MainWindow()
        {
            InitializeComponent();
        }


        public void PortUsb()
        {
            SerialPort portUSB = new SerialPort();
            portUSB.BaudRate = 115200;
            portUSB.PortName = "COM10";
            portUSB.DtrEnable = true;
            portUSB.Open();

            while (true)
            {
                string danePrzychodzace = portUSB.ReadLine();
            }
        }

        public void textBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            textBox.Text = string(danePrzychodzace);
0

W momencie kiedy zrobisz while (true) to twoja metoda PortUsb nigdy się nie kończy. To raz. Dwa, twoje ustawianie zawartości textBox masz w funkcji obsługującej zdarzenie zmiany zawartości textBox...

Nie odczytuj ciągle portu (samemu), użyj zdarzenia DataReceived klasy SerialPort, aby to działało asynchronicznie. I dopiero w procedurze obsługi zdarzenia DataReceived przypisuj odczytaną wartość do tego textBoksa.

0

Zrozumiałem chyba wszystko co do zasady działania, ale dlaczego gdy chce zmienić text w TextBoxie na sygnał który przychodzi nie rozpoznaje mi zmiennej sygnal ?

    public MainWindow()
    {
        InitializeComponent();
    }

    public static void MySerialPort()
    {
        SerialPort mySerialPort = new SerialPort("COM10");

        mySerialPort.BaudRate = 115200;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        mySerialPort.RtsEnable = true;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();
        
    }

    public static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort dane = (SerialPort)sender;
        string sygnal = dane.ReadExisting();
    }

    public void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        textBox.Text = (sygnal);
    } 
0

nie zrozumiałeś

    public static void DataReceivedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
    {
        SerialPort dane = (SerialPort)sender;
        textBox.Text = dane.ReadExisting();
    }
0

czy to będzie coś takiego ?

    public partial class MainWindow : Window
    {
        string dane;
        string sygnal;
        private SerialPort sender;

        public MainWindow()
        {
            InitializeComponent();
            SerialPort mySerialPort = new SerialPort("COM10");

            mySerialPort.BaudRate = 115200;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            
        }

        private  void DataReceivedHandler(
                     object sender,
                     SerialDataReceivedEventArgs e)

        {
            MethodA();
            MethodB();
            MethodB();
        }
        public async Task MethodA()
        {

            SerialPort dane = (SerialPort)sender;
            await MethodB();
            
        }

        public async Task MethodB()
        {
            sygnal = dane.ToString();
            await MethodC();
           
        }
        public async Task MethodC()
        {
            textBlock.Text = (sygnal);
            await MethodA();
        }
0

przecież to się nawet nie skompiluje

1

Programowanie nie polega na tym, żeby wrzucać losowe kawałki kodu i patrzeć, czy to zadziała. Tutaj problemem jest to, że stworzyłeś niezbyt wiadomo po co 3 metody, które sobie korzystają ze swoich zmiennych nawzajem, a do tego 3 pola w klasie, które w dodatku będą miały niepoprawnie nadawane wartości.

Zamiast wydziwiać, zrób to w postaci 3 w jednym:

private  void DataReceivedHandler(
                    object sender,
                    SerialDataReceivedEventArgs e)
 
{    
    var dane = (SerialPort)sender;    
    textBlock.Text = dane.ReadLine();
}

Zmienna "textBlock" przynależy do całej klasy, więc DataReceivedHandler ma do niej dostęp. Żadne inne pola klasy nie są tutaj potrzebne, wszystko opiera się na lokalnych zmiennych w tych metodach.

Zrobienie z kolei ToString na obiekcie klasy SerialPort na pewno nie da ci tego, co aktualnie znajduje się na porcie, tylko coś zupełnie nieistotnego w tym momencie :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1