C#BackgroundWorker和Com端口问题

本文关键字:问题 Com C#BackgroundWorker | 更新日期: 2023-09-27 18:29:38

好的。我有一个监视2个COM端口的程序。一个挂在磅秤上,另一个挂到modbus板上。

我的问题出在连接到modbus板的COM端口上。我的程序是每100MS读取一个传感器(在modbus板上)。它返回0或1(通过COM端口)以确定传感器是否被阻塞。如果它被阻塞,则通过端口向板发送信号。

我的问题是我无法停止监测传感器,但在发送其他信号之前,我必须确保com端口没有使用。

监视传感器的例程位于后台工作线程上。一旦传感器跳闸,就会产生另一个线程,向modbus板发送信号。因此,当我向电路板发送信号时,我需要暂停"传感器线程"。我该怎么做?

记住它是一个BackgroundWorker,所以Thread.Join不是一个选项。

这是我的代码:

private void SensorThread_DoWork(object sender, DoWorkEventArgs e)
    {
        if (SensorThread.CancellationPending == true)
            e.Cancel = true;
        else
        {
            ReadSensor();
        }    
    }

此线程的RunWorkerCompleted只是重新启动线程。以下线程不断监测"传感器状态",以查看传感器何时被阻塞:

public void ScaleThread_DoWork(object sender, DoWorkEventArgs e)
    {
        if (ScaleThread.CancellationPending == true)
        {
            e.Cancel = true;
        }
        else
        {
            //sensor is blocked
            if (sensorstatus == 0)
            {
                ReadScale();
                prevgate = gate;
                gate = DetermineGate();
                //SaveData();
                SetOpenDelay();
                SetDuration();
                //no gate was selected, meat out of range, runs off end
                if (gate == 0)
                {
                    txtStatus.Invoke(new UpdateStatusCallback(UpdateStatus), new object[] { meatweight.ToString() + 
                                                                                    "lbs is out of range"});
                }
                else
                {
                    //this triggers a thread to send a signal to the modbus board
                    gateTimer.Start();
                }
            }
        }
    }

为此完成的RunWorkerCompleted重新启动该线程,使其成为一个循环

C#BackgroundWorker和Com端口问题

创建一个负责所有发送操作的线程。实现一个队列,该队列向该线程提供要发送到设备的消息。您可以使用新的BlockingCollection<T>轻松地实现这一点。

或者,使用TPL创建一个有限并行度为1的TaskScheduler,如下所示:http://msdn.microsoft.com/en-us/library/ee789351.aspx

现在,您可以简单地触发要发送到设备的任务,它们将按顺序执行。

除非需要在发送方和读取器之间传递信息,否则我会在其自己的独立线程上实现读取器操作。