Чтение последовательных данных - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать приложение WPF, которое будет получать последовательные данные от Arduino. Arduino отправит «1», когда пользователь включит кодировщик, а WPF возьмет это и увеличит отметку громкости 1.

public MainWindow()
    {
        InitializeComponent();

        string comPort = "COM6";
        SerialPort mySerialPort = SerialPortCommunications(comPort);
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(OnDataRecieved);
        mySerialPort.Open();
        mySerialPort.DiscardInBuffer();

    }
private void OnDataRecieved(object sender, SerialDataReceivedEventArgs e)
    {
        var serialDevice = sender as SerialPort;
        string indata;
        indata = serialDevice.ReadExisting();
        MessageBox.Show(indata);
        MessageBox.Show("Fired");

    }
public SerialPort SerialPortCommunications(string comPort)
    {
        SerialPort mySerialPort = new SerialPort(comPort);
        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;
        //mySerialPort.DiscardNull = true;
        return mySerialPort;
    }

Проблема, с которой я сталкиваюсь, если Arduino постоянно не отправляет Данные моего события не будут срабатывать. Это исправлено постоянной отправкой 0 из arduino, однако, когда мне нужно получить 1, чтобы сигнализировать об изменении громкости, я не могу перебрать входной буфер. Я создал консольное приложение с тем же кодом, что и выше, который ожидает ввода данных пользователем в главном, который имеет проблему. Arduino может молчать в течение часа, а когда час истечет, отправленные данные отобразятся на консоли. В идеале в моем WPF канал будет молчать, пока не будут получены данные для изменения сигнала.

Любая помощь приветствуется, спасибо.

1 Ответ

0 голосов
/ 05 февраля 2020

Один из подходов состоит в том, чтобы дождаться получения данных и проанализировать их как int, тогда, если результат равен 1, вы можете запустить желаемую функцию

private void OnDataRecieved(object sender, SerialDataReceivedEventArgs e)
    {
        var serialDevice = sender as SerialPort;
        var indata = serialDevice.ReadExisting();
        int DigitFromArduino = 0;
        if(int.TryParse(indata,out DigitFromArduino))
            if(DigitFromArduino == 1)
            {
                // call your function to increase the volum
            }
    }
...