Событие SerialDataReceived не срабатывает (настройка SerialPort для Arduino Clone) - PullRequest
0 голосов
/ 13 апреля 2019

это мой первый вопрос здесь, так как я нигде не нашел ответа.

Я не особенно новичок в WPF и C #, но я никогда не читал SerialData с ним раньше, и яУ меня возникли элементарные проблемы.

Установка:

Клон Arduino (SparkFun Pro Micro) отправляет сообщение "Hello!"+ номер к последовательному порту USB (COM5) раз в секунду:

String hello = "hello!";
Serial.println(hello + i);
i++;
delay(1000);

И попытка получить его в WPF с помощью простой кнопки, которая обновляет данные в TextBlock (tbData).

SerialPort sp = null;
String str = null;
int i = 0;

public MainWindow()
{
      InitializeComponent();
      sp = new SerialPort("COM5", 9600);
      sp.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
      sp.Open();
}


void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
      str = sp.ReadLine();
}

private void Refresh_Click(object sender, RoutedEventArgs e)
{
      tbData.Text = str;
}

Но ничего не происходит, я, кажется, получаю пустую строку, так как TextBlock ничего не показывает, когда я нажимаю кнопку Refresh_Click.

Я могу заставить его работать с новым потоком, но время ожидания истекло, и я прочитал здесь ( Таймауты в последовательном порту C # ), что лучший (и самый простой из возможных) метод использует событие SerialDataReceived.

t = new Thread(() =>
{
      int i = 0;
      while (run)
      {
            SerialString = sp.ReadLine();
            Thread.Sleep(1000);
      }

      sp.Close();

});

ЧтоЯ скучаю, должно быть что-то вроде изменения размера буфера?Или что-то подобное?

1 Ответ

0 голосов
/ 14 апреля 2019

Кажется, я нашел ответ!

Я не очень разбираюсь в последовательной связи, но сегодня я столкнулся с функцией MODE cmd:

C:\Users\Username>mode

Status for device COM5:
-----------------------
    Baud:            9600
    Parity:          None
    Data Bits:       8
    Stop Bits:       1
    Timeout:         ON
    XON/XOFF:        OFF
    CTS handshaking: OFF
    DSR handshaking: OFF
    DSR sensitivity: OFF
    DTR circuit:     OFF
    RTS circuit:     OFF

И я заметил, что он менялся всякий раз, когда я заставлял Arduino IDE сообщать мне данные - что всегда будет успешно! - и всякий раз, когда я пытался заставить WPF делать то же самое. Выше приведен возврат MODE после того, как я попытался запустить свой собственный код, и:

Status for device COM5:
-----------------------
    Baud:            9600
    Parity:          None
    Data Bits:       8
    Stop Bits:       1
    Timeout:         OFF
    XON/XOFF:        OFF
    CTS handshaking: OFF
    DSR handshaking: OFF
    DSR sensitivity: OFF
    DTR circuit:     ON
    RTS circuit:     ON

это то, что было показано после открытия Tools> Serial monitor в Arduino IDE и немедленного его закрытия.

Я изменил свой код WPF с:

sp = new SerialPort("COM5", 9600);
sp.Open();

до:

sp = new SerialPort("COM5", 9600);
//sp.ReadTimeout = 200;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Open();

И теперь и пример потока, и событие SerialDataReceived работают без сбоев (хорошо, за исключением того, что я не могу обновить поток пользовательского интерфейса в потоке SerialDataReceived).

Я надеюсь, что кто-то найдет это полезным.

...