【问题标题】:C# Read serial port value only if changed (weight machine)C#仅在更改时读取串行端口值(重量机器)
【发布时间】:2016-01-29 08:43:07
【问题描述】:
private SerialPort _serialPort = null;

public WeightDisplay()
{
    InitializeComponent();
    Control.CheckForIllegalCrossThreadCalls = false; 
    _serialPort = new SerialPort("COM1", 9600, Parity.None, 8);
    _serialPort.StopBits = StopBits.One;
    _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);
    _serialPort.Open();
}
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    txtWeight.Text = _serialPort.ReadExisting();
}

此代码连续从连接到串行端口的称重机获取值并将其显示在文本框中。代码工作正常,但如果权重发生变化,我想更改文本框的值,即。如果ReadExisting() 返回的值与之前的值不同。(我不希望文本框无缘无故地波动)

当我调试时,我得到这个值:

"+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r"

有时甚至是大字符串

我的文本框显示"+ 0.000"(不断闪烁)

【问题讨论】:

    标签: c# serial-port


    【解决方案1】:

    你可以这样做:

    void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
       var newVal = _serialPort.ReadExisting();
    
       if(String.Compare(txtWeight.Text, newVal) != 0)
          txtWeight.Text = newVal;
    }
    

    您现在只更改 TextBox 的值,如果该值与之前的值不同。

    更新
    由于您得到“+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r”,但只需要“+ 0.000”,您可以使用正则表达式来处理您的数据:

    void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
       var expr = "\\+ [0-9]+\\.[0-9]+";
       var newVal = _serialPort.ReadExisting();
    
       MatchCollection mc = Regex.Matches(newVal, expr);
    
       if (mc.Count > 0)
       {
          if(String.Compare(txtWeight.Text, mc[0].Value) != 0)
             txtWeight.Text = mc[0].Value;
       }
    }
    

    此行仅获取“+ 0.000”值并将它们放入集合mc

    MatchCollection mc = Regex.Matches(newVal, expr);
    

    现在只有这个集合的第一个元素被mc[0].Value访问(接收数据的第一个“+ 0.000”值)

    【讨论】:

    • 对不起..我忘了提到我已经尝试过上述方法,但每次如果条件评估为真并且文本框的值发生变化。当我调试时,我在 newVal variable="+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r" 中得到这个值并且我的文本框显示 "+ 0.000"
    • 文本框应该显示“+ 0.000”还是应该显示“+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r+ 0.000 S\r " ?
    • 是的..它应该显示“+ 0.000”。我认为这是因为线程而发生的。
    • @AdilNaik 更新了我的答案,试试这个。
    • 你太棒了..它工作了:) 非常感谢我对你的代码做了一些小改动 1) 在正则表达式中,'+' var expr = "\\+ [0-9 ]+\\.[0-9]+"; 2) 检查 mc 的计数是否 >0 if (mc.Count>0) { if (String.Compare(txtWeight.Text, mc[0].ToString()) != 0) txtWeight.Text = mc[0]。 ToString(); } 更新你的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多