Передача данных из Arduino в C # RealTime с использованием таймера и задачи - PullRequest
1 голос
/ 22 сентября 2019

Проблема: переменная "str", объявленная в Form1, не читается в методе Timer1_Tick().Вход поступает от Arduino, который подключен к нескольким датчикам.Входы датчиков объединяются в одну строку (пример [1,2,4,5,6]).Для этого кода мне просто нужно отобразить эту строку.Любая помощь по этому вопросу высоко ценится.

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            SerialPort currentPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
            currentPort.Open();
            string str = currentPort.ReadLine();
        }
        private void Timer1_Tick(object sender, EventArgs e)
        {
            Task.Run(() => {
                this.BeginInvoke((Action)(() => { label1.Text = str; }));
            });

        }

        private void Button1_Click(object sender, EventArgs e)
        {//Start
            timer1.Start();
        }

        private void Button2_Click(object sender, EventArgs e)
        {//Stop
            timer1.Stop();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Вам необходимо объявить переменную "str" ​​в области Form1, используйте этот код:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        string str;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            SerialPort currentPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
            currentPort.Open();
            str = currentPort.ReadLine();
        }
        private void Timer1_Tick(object sender, EventArgs e)
        {
            Task.Run(() => { this.BeginInvoke((Action)(() => { label1.Text = str; })); });
        }

        private void Button1_Click(object sender, EventArgs e)
        {//Start
            timer1.Start();
        }

        private void Button2_Click(object sender, EventArgs e)
        {//Stop
            timer1.Stop();
        }
    }
}
1 голос
/ 22 сентября 2019

Переменная «str», объявленная в Form1, не читается в Timer1_Tick.

Причина в том, что переменная str объявлена ​​в Form1_Load, поэтомуэто локальная переменная.Объявите это только внутри класса Form1, но вне методов.Таким образом, это будет глобальная переменная, которая доступна из любого метода внутри Form1 класса, в том числе методов таймера.

...