首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#从串行端口读取数据-如何仅获取新数据/当前数据?

C#从串行端口读取数据-如何仅获取新数据/当前数据?
EN

Stack Overflow用户
提问于 2019-07-06 04:34:38
回答 1查看 974关注 0票数 0

我正在用ASP.NET做一个项目,后面的代码是用C#写的。我一直在从一个刻度尺上读取数据,如果刻度尺上显示的重量在您在实际刻度尺上设置的两个数字内,它会向我发送“是”或“否”。据我所知,这两个字符串是刻度所能发送的唯一数据。现在,页面上的一个按钮读取数据,并将标签更改为“做得好”或“做错了”(非常简单,现在只是在处理功能)。但是当我点击按钮的时候,我得到了更老的数据,例如,我会点击两次,但是在刻度上没有任何东西,得到的结果是“不”,标签会变成“错误”,但是一旦我把一些东西放在刻度上,而不是得到“是”,我就会得到类似于"NOTYES“的东西。

我在串口上有一个ReadTimeout,我有一个线程,但我不熟悉线程,这是我第一次做这样的事情。我向串行端口添加了一个DiscardInBuffer(),它似乎有一些帮助,但也不是太多,我也不太确定该把它放在哪里。

我还一直在打印到控制台,这样我就可以看到实际正在读取的数据。它不断地发送数据,所以我会有一个有点不可预测的巨大字符串,就像“NOT\n NOT\n NOT\n...”这就是我清理数据的原因。

该按钮具有自动回发功能,并且标签位于更新面板中,因此它运行loadPage(),然后依次运行read()和buttonClick() -这在这一点上基本上是无用的。

代码语言:javascript
复制
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“之类的东西。

EN

回答 1

Stack Overflow用户

发布于 2021-08-07 16:40:51

您可以在这个使用ReadLine()方法的link中尝试这个示例代码

代码语言:javascript
复制
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) {};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56908979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档