串口不禁用

时间:2014-08-06 13:05:05

标签: c# visual-studio-2010 serial-port

我有一个串口等待来自外部秤的一些重量字符串。问题在于,对于被称重的相同产品,秤发送多个读数,大约每秒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事件。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

就我个人而言,我不会想要删除这些事件。我让事件触发并找到过滤数据的方法。

我对你的硬件知之甚少,但是当重量大于零时,每次读数从不稳定到稳定时,你都可以打印一个标签?或者在收到几个具有相同权重的稳定值时打印标签,然后忽略相同值的后续权重。一旦值稳定,您可以平均所有收到的值,并在读数变得不稳定或偏离一定幅度时打印标签。