C # Чтение данных с последовательного порта - Как получить только новые / текущие данные? - PullRequest
0 голосов
/ 05 июля 2019

Я работаю над проектом в ASP.NET, а код находится на C #. Я считывал данные из шкалы, которая посылает мне «ДА» или «НЕ», если вес, отображаемый на шкале, находится в пределах двух чисел, которые вы установили на фактической шкале. Насколько я знаю, эти две строки - единственные данные, которые может отправить шкала. Прямо сейчас, кнопка на странице считывает данные и меняет метку на «хорошая работа» или «неправильная» (довольно просто просто работает над функциональностью прямо сейчас). Но когда я нажимаю кнопку, я получаю более старые данные, например, дважды нажимаю на них, не указывая ничего на шкале, и получаю «НЕ», а метка изменится на «неправильная», но как только я добавлю что-то в шкалу, в пределах лимита вместо «ДА» я получу что-то вроде «НОТЫ».

У меня есть ReadTimeout на последовательном порту, и у меня есть поток, но я не знаком с потоками, я впервые делаю что-то подобное. Я добавил DiscardInBuffer () к последовательному порту, и это, казалось, немного помогло, но не слишком, я также не был слишком уверен, куда его поместить.

Я также печатал на консоль, чтобы видеть, какие данные действительно читаются. Он постоянно отправляет данные, поэтому у меня будет огромная строка, которая несколько непредсказуема, например «NOT \ nNOT \ nNot \ n ...», поэтому я очистил данные.

Кнопка имеет функцию автоматической отправки назад, а метка находится на панели обновлений, поэтому она запускает loadPage (), затем read (), а затем buttonClick (), что на данный момент практически бесполезно.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO.Ports;
using System.Diagnostics;
using System.Threading;

namespace ScaleTest
{

    public partial class WebForm1 : System.Web.UI.Page
    {
        public SerialPort port;
        public string scaleData = "";

        protected void Page_Load(object sender, EventArgs e)
        {

            if (IsPostBack)
            {
                Thread readThread = new Thread(Read);
                port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
                port.ReadTimeout = 1000;
                if (port.IsOpen == false)
                    try
                    {
                        port.Open();
                    }
                    catch (Exception oex)
                    {
                        Debug.WriteLine(oex);
                    }
                readThread.Start();
                readThread.Join();
                port.Close();
            }
        }

        public void Read()
        {
            try
            {
                string message;
                string scaleData = port.ReadLine();
                port.DiscardInBuffer();
                Debug.WriteLine(scaleData);
                scaleData = scaleData.Trim().Replace("\r", string.Empty).Replace("\n", string.Empty);
                scaleData = String.Join("", scaleData.Distinct());


                Debug.WriteLine(scaleData);


                if (scaleData == "YES")
                {
                    message = "Good Job!";
                }
                else if (scaleData == "NOT")
                {
                    message = "WRONG!";
                }
                else
                {
                    message = "Try Again.";
                }
                ScaleLabel.Text = message;

            }
            catch (TimeoutException) { }
        }

        protected void ButtonClick(object sender, EventArgs e)
        {
        }

    }
}

Если я начну с ничего на шкале, запустлю программу и нажму кнопку, scaleData будет «НЕ» и метка изменится на неправильный, что является правильным. Но если я помещу что-то в шкалу в пределах лимита и снова нажму кнопку, мне обычно придется нажимать кнопку несколько раз, чтобы получить «ДА», потому что она получает старые данные и дает мне такие вещи, как «НОТЫ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...