Member 12643399 Ответов: 3

Что я делаю не так? В WPF связи последовательный порт


Привет,
Мне нужно что-то отображать, когда я получаю данные. Не могли бы вы сказать мне, как исправить мой код? Я думаю, что вызов нового EventHandler работает неправильно.
Спасибо!

Что я уже пробовал:

private void button_Click(object sender, RoutedEventArgs e)
{
    try
    {
        if (!sPort.IsOpen)
        {
            sPort.PortName = comboBox.Text;
            sPort.BaudRate = 9600;
            sPort.Parity = Parity.None;
            sPort.DataBits = 8;
            sPort.StopBits = StopBits.One;

            sPort.Open();

            sPort.DataReceived += sPort_DataReceived;
        }
    }
    catch { }
}

private void sPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Dispatcher.Invoke(new EventHandler(DisplayData));
}

private void DisplayData(object o, EventArgs e)
{
    Example_label.Content = "received";
}

3 Ответов

Рейтинг:
16

User 59241

Используйте рабочие примеры в качестве отправной точки везде, где это возможно. Это показывает, как читать из SerialPort:
Последовательный порт.Событие DataReceived (Системы.ИО.Порты)[^]
Порядок, в котором вы настраиваете и открываете порт, имеет решающее значение (создание экземпляра, установка параметров и присоединение обработчика datareceived). В вашем примере много ошибок, и может потребоваться небольшое фоновое чтение. Этот пример должен вывести вас на правильный путь: Простой серийный номер для Microsoft Visual C# Express[^] тоже: c# - Как читать и писать из последовательного порта-переполнение стека[^]

Ваше приложение должно быть разработано для буферизации входящих данных (что может произойти в любое время). Затем эти данные могут быть использованы по мере необходимости другими частями вашего приложения.

[изменить следующий ответ]
Видеть: Последовательная связь с использованием WPF, RS232 и PIC-связи[^]


Member 12643399

ОК, я поменял "вид спорта.DataReceived += sPort_DataReceived;" =&ГТ; "спорт.DataReceived += новый SerialDataReceivedEventHandler(sPort_DataReceived);" =&ГТ; "sPort_DataReceived частных статических недействительным(объект отправителя, SerialDataReceivedEventArgs е)", и я вижу, что изменение содержимого метки или "диспетчером.Invoke(new EventHandler(DisplayData));" не может быть использован таким образом, потому что "ссылка на объект требуется для нестатического поля, метода или свойства ..." так как же мне решить эту проблему? Вторая и третья ссылки мне не помогли, это примеры WinForm, и мой код там работал :(

[no name]

Нет необходимости в статике. Смотрите мою правку и, пожалуйста, научитесь пользоваться Google. Я не могу комментировать дальше, потому что не вижу вашего кода.

Member 12643399

Да, я видел это, но подумал, что есть лучший способ, и оставил его. Однако теперь он, кажется, работает нормально, так что спасибо :)

Рейтинг:
1

Patrice T

Цитата:
Мне нужно что-то отображать, когда я получаю данные. Не могли бы вы сказать мне, как исправить мой код? Я думаю, что вызов нового EventHandler работает неправильно.

Там нечего исправлять, вам нужно переписать свой код.
Но прежде всего вам нужно понять, как работает последовательный порт. Это slooooow, очень sloooooow, не ожидайте, что ваши данные будут ждать в буфере сразу после открытия порта.
Последовательная связь в C# для начинающих[^]
sPort.DataReceived += sPort_DataReceived;

Объект последовательного порта не является местом хранения данных, есть буфер, но вы не можете использовать его для хранения некоторых данных.
Учебник По Связи Последовательного Порта С Примерами C# - CodeSamplez.com[^]


Member 12643399

Ну, должно быть, что-то не так с этим кодом, потому что, когда приходят данные, я получаю "приложение находится в режиме перерыва". Точно я знаю, как это работает с WinForm, но похоже, что WPF работает немного по-другому?

Рейтинг:
0

Bernhard Hiller

Вы пометили свой вопрос "WPF", но ваш код больше похож на Windows Forms. Использовать ViewModel со свойствами, привязанными к пользовательскому интерфейсу. То PropertyChanged событие будет автоматически отправлено в поток пользовательского интерфейса, так что вы избежите всех проблем с перекрестной резьбой (DataReceived происходит всегда в другом потоке).
И вы также должны узнать, когда вы больше не получите никаких байтов (посмотрите на протокол для вашего устройства), чтобы снова изменить сообщение о состоянии.