Серийный монитор, недопонимание обработчика данных, полученное с помощью C #, WPF - PullRequest
0 голосов
/ 31 мая 2018

Я разрабатываю последовательный монитор для своего приложения в WPF, программирую на C #.У меня проблемы с управлением событием DataReceived, потому что мне нужен монитор в реальном времени, например, HyperTerminal или TeraTerm (я их не использую, потому что хочу, чтобы мой терминал был частью инструмента связи Ethernet, который я уже разработал с использованием winPcap).

Мне нужно прочитать некоторые данные из моего микроконтроллера, отобразить их в textBox (он просто печатает меню и список доступных команд), и когда он завершит последовательность загрузки, я хотел бы с ней взаимодействовать,ничего особенного, просто отправьте команду «flash-» для программирования fpga платы.

Мое приложение отправляется в исключение, когда я пытаюсь обновить textbox.text с полученными данными.Я пытался искать везде, но, несмотря на множество примеров, я не уловил то, что правильно объясняет код.

Вот код, спасибо заранее

namespace WpfApplication1 {
/// <summary>
/// Interaction logic for SerialMonitor.xaml
/// </summary>
public partial class SerialMonitor : Window {

    //VARIABLES
    public SerialPort comPort = new SerialPort();

    public SerialMonitor() {
        //initialization
        InitializeComponent();
        scanPorts();

    }



    private void scanPorts() {
        textBoxIndata.Clear();
        string[] ports = SerialPort.GetPortNames();
        foreach (string port in ports) {
            comboBoxPorts.Items.Add(port);
        }
    }



    private void openComBtn_Click(object sender , RoutedEventArgs e) {

        comPort.Parity = Parity.None;
        comPort.DataBits = 8;
        comPort.ReadTimeout = 500;
        comPort.StopBits = StopBits.One;

        if (comboBoxPorts.SelectedItem != null && comboBoxPorts.SelectedItem != null) {

            comPort.PortName = comboBoxPorts.SelectedItem.ToString();
            comPort.BaudRate = Convert.ToInt32(comboBoxBaud.Text);

            try {
                //Open port and add the event handler on datareceived
                comPort.Open();                 
                comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            }
            catch (Exception ex) {
                MessageBox.Show(ex.ToString());                    
            }              
        }
        if (comPort.IsOpen) {
            label1.Content = "COM PORT OPEN";              
        }
    }


    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {

    }


    //function to update the textBox, didn't manage to get it working
    private void updateUI (string s) {

    }



    //CLOSE AND EXIT BUTTONS
    private void closeComBtn_Click(object sender , RoutedEventArgs e) {
        if (comPort.IsOpen) {
            comPort.Close();
            label1.Content = "COM PORT CLOSED";
        }
    }

    private void exitBtn_Click(object sender , RoutedEventArgs e) {
        if (comPort.IsOpen) {
            comPort.Close();
        }
        this.Close();
    }
}

}

У меня теперь проблема в том, что когда я посылаю свою команду, используя SerialPort.Write (string cmd) , я не могу прочитать ответ ...

РЕДАКТИРОВАТЬ:Исправлено все, я выложу код, если кто-то заинтересован в программировании такого инструмента, как этот:)

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

У меня теперь проблема в том, что когда я отправляю свою команду, используя SerialPort.Write (string cmd) , я не могу прочитать ответ ...

0 голосов
/ 31 мая 2018
Событие

DataReceived возвращается в другой / вторичный поток, что означает, что вам придется выполнить маршалинг обратно в поток пользовательского интерфейса, чтобы обновить ваше TextBox

SerialPort.DataReceived Event

Событие DataReceived возникает во вторичном потоке при получении данных от объекта SerialPort.Поскольку это событие возникает во вторичном потоке, а не в основном потоке, попытка изменить некоторые элементы в основном потоке, такие как элементы пользовательского интерфейса, может вызвать исключение потока.Если необходимо изменить элементы в главной форме или элементе управления, отправьте запросы на изменение обратно с помощью Invoke, который выполнит работу в соответствующей цепочке.

Вы можете использовать Dispatcher.BeginInvoke или Dispatcher.Invoke Methodвернуться к основной теме

Exmaple

Application.Current.Dispatcher.Invoke(new Action(() => { /* Your code here */ }));

или

someControl.Dispatcher.Invoke(new Action(() => { /* Your code here */ }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...