Я работаю над проектом в 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 будет «НЕ» и метка изменится на неправильный, что является правильным. Но если я помещу что-то в шкалу в пределах лимита и снова нажму кнопку, мне обычно придется нажимать кнопку несколько раз, чтобы получить «ДА», потому что она получает старые данные и дает мне такие вещи, как «НОТЫ».