串口未禁用

本文关键字:串口 | 更新日期: 2023-09-27 18:16:35

我有一个串行端口等待一些重量字符串从外部秤。问题是,秤发送多个读数,大约每秒8个读数,所有这些读数都是相同的重量,对于相同的产品被称重。我必须在收到重量后打印一个标签,但由于我有多个读数,因此它会在收到每个读数时打印一个标签。

我尝试了下面的解决方案,对前两个被称重的产品有效,然后再次触发多次打印。

private void SerialReader_Event(object sender, SerialDataReceivedEventArgs e)
    {
        string dataRead = String.Empty;
        try
        {
            SerialPort port = (SerialPort)sender;
            if (port.IsOpen)
            {
                dataRead = port.ReadExisting();
            }
            portDataRead = new DataRead(HandlePortReadData);
            this.Invoke(portDataRead, new object[] { dataRead });
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Reading Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
private void HandlePortReadData(string dataRead)
    {
        int parsedValue;
        if (!String.IsNullOrEmpty(dataRead))
        {
            var stability = dataRead.Substring(1, 1);
            var weight = dataRead.Substring(2, 5);
            if (stability == "0")   //0 is a Stable wieght
            {
                this.RemoveReceivedEventHandler();
                var parsedSuccess = int.TryParse(weight, out parsedValue);
                if (parsedSuccess)
                {
                    if (parsedValue > _weightTrigger) //only trigger print if weight is greater than (n) weight
                    {
                        if (!this.IsDisposed)
                        {
                            AddWeight(parsedValue);
                            PerformPrint();
                        }
                    }
                }
            }
        }
    }
private void RemoveReceivedEventHandler()
    {
        //remove event
        sp.DataReceived -= SerialReader_Event;
        System.Threading.Thread.Sleep(1000);
        sp.DiscardInBuffer();
        sp.DiscardOutBuffer();
        _timer.Enabled = true;
        _timer.Interval = _weighingDelay;
        _timer.AutoReset = false;
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Tick);
        _timer.Start();
    }
void _timer_Tick(object sender, EventArgs e)
    {
        this.AddReceivedEventHandler();
    }
private void AddReceivedEventHandler()
    {
        if (sp != null)
        {
            sp.DataReceived += SerialReader_Event;
            sp.DiscardInBuffer();
        }
        //InitialiseSerialPort();
        if (_timer != null)
        {
            _timer.Stop();
            _timer.Enabled = false;
        }
    }

可以看到,当我删除DataReceived事件时,我启动一个计时器,几秒钟后,应该再次添加DataReceived事件。

我在这里做错了什么?

串口未禁用

我个人不会费心尝试删除事件。我将让事件触发并找到一种方法来过滤数据。

我不太了解你的硬件,但也许你可以打印一个标签,每次读数从不稳定到稳定,当重量大于零?或者在接收到两个具有相同权重的稳定值时打印一个标签,然后忽略相同值的后续权重。一旦一个值是稳定的,你可以平均你收到的所有值,并打印标签一旦读数不稳定或偏离了一定的边距。