我正在用ASP.NET做一个项目,后面的代码是用C#写的。我一直在从一个刻度尺上读取数据,如果刻度尺上显示的重量在您在实际刻度尺上设置的两个数字内,它会向我发送“是”或“否”。据我所知,这两个字符串是刻度所能发送的唯一数据。现在,页面上的一个按钮读取数据,并将标签更改为“做得好”或“做错了”(非常简单,现在只是在处理功能)。但是当我点击按钮的时候,我得到了更老的数据,例如,我会点击两次,但是在刻度上没有任何东西,得到的结果是“不”,标签会变成“错误”,但是一旦我把一些东西放在刻度上,而不是得到“是”,我就会得到类似于"NOTYES“的东西。
我在串口上有一个ReadTimeout,我有一个线程,但我不熟悉线程,这是我第一次做这样的事情。我向串行端口添加了一个DiscardInBuffer(),它似乎有一些帮助,但也不是太多,我也不太确定该把它放在哪里。
我还一直在打印到控制台,这样我就可以看到实际正在读取的数据。它不断地发送数据,所以我会有一个有点不可预测的巨大字符串,就像“NOT\n NOT\n NOT\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将变为"NOT“,标签将变为wrong,这是正确的。但如果我把一些东西放在天平上,然后再按一次按钮,我通常必须按几次按钮才能得到“是”,因为它得到的是旧数据,给我的是"NOTYES“之类的东西。
发布于 2021-08-07 16:40:51
您可以在这个使用ReadLine()方法的link中尝试这个示例代码
public static void Main()
{
_serialPort = new SerialPort();
_serialPort.BaudRate = 115200;
_serialPort.PortName = "COM7";
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
if (!sp.IsOpen) return;
string indata = _serialPort.ReadLine();
Console.WriteLine(indata);
}
catch (Exception) {};
}https://stackoverflow.com/questions/56908979
复制相似问题