Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串行端口未禁用_C#_Visual Studio 2010_Serial Port - Fatal编程技术网

C# 串行端口未禁用

C# 串行端口未禁用,c#,visual-studio-2010,serial-port,C#,Visual Studio 2010,Serial Port,我有一个串口在等待来自外部秤的重量字符串。问题是,对于正在称重的同一产品,电子秤发送多个读数,大约每秒8个读数,所有读数的重量都相同。收到重量后,我必须打印标签,但由于我获得了多个读数,因此每次收到读数时,它都会打印标签 我尝试了以下解决方案,并对前两个产品进行称重,然后再次触发多个打印 private void SerialReader_Event(object sender, SerialDataReceivedEventArgs e) { string dataRe

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


我做错了什么?

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


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

每当调用RemoveReceiveDeventhadler时,我都会启动计时器。只有在发生变化时才打印新数据。您无法确保这一点的可靠性。删除事件处理程序的问题只是在实践中出错的一个预兆,没有任何可靠的方法使程序与包流保持同步。您需要与工厂工程师交谈,需要某种机制来可靠地检测进入秤的包装。可能来自控制输送机的PLC,可能需要一个光电探测器等。我有一个非常敏感的秤类似的问题,读数将由路过的人(或打喷嚏!)产生的微风触发。我建立了一个机制来忽略前一个读数的+/-阈值的读数(我想你们已经尝试过了,或者你们只是使用了n以上的权重?),然后就开始了。但不清楚你的秤是否每秒只发送8个读数,而不管它是否认为重量已经改变。我得到多个读数,不管数值是否改变。我试图通过检查稳定重量(0)来消除+读数,但即使重量稳定,我也会得到多个读数,秤会不断发送数据。仅当重量超过n时才应进行打印。如何检测DataReceived事件何时完成接收数据以计算平均值并打印?我可以在一定的秒数(称重过程的持续时间)后启动计时器进行此计算,但这听起来不是一个合适的解决方案。如果不提供更多信息,我认为您不会得到合适的解决方案。你能用天平发出的测量两个项目的完整信息序列更新你的问题吗?通过查看该序列,您/我们应该能够确定一些合适的过滤。我建议将逻辑转换为接收所有数据,然后使用正确的过滤来识别单个项目的称重时间。如果我理解正确,我应该首先接收所有读数,然后应用过滤。我可能只保留所有读数,并接受所有读数的第一个稳定权重。听起来不错,就是这样。我把它想象成一个长长的读数流,属于多重项目的称重。然后,您可以使用过滤功能来区分不同物品的重量。您是否需要一种方法来识别该流中的一组值属于单个项。然后你可以选择使用第一个值,所有值的平均值,或者你能想到的任何其他值。