C# 只在变化时读取串口值(称重机)

C# Read serial port value only if changed (weight machine)

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"(持续闪烁)

你可以这样做:

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”值)