0

我目前正在开发一个项目,我正在使用 Visual Studios 2010 c# 中的SerialPort库从定制的 PCB 上读取数据。

我目前正在尝试通过单击按钮从设备读取作为数据字节提供给我的某种类型的数据,如果设备没有响应,则在超时前等待五秒钟。

但是由于某种原因,计时器出现故障,并且经常在五秒钟之前到期,从而停止存储有效数据。以下是我使用的代码,有人可以指出我的缺陷吗?我怀疑我使用的System.Windows.Forms.Timer中的事件计时器功能不正确。

按钮点击

    bool flag = false;
    private void btnGetData_Click(object sender, EventArgs e)
    {

        string command = "*data#";//make string command to send
        sendCommand(command);
        flag = true;
        gui.Timer.Interval = timerlength;
        gui.Timer.Enabled = true;
        gui.Timer.Tick += new EventHandler(Timer_Tick);


    }

定时器事件处理程序

    private void readVarsTimer_Tick(object sender, EventArgs e)
    {
       if (flag == true)
        {
            flag = false;//set flag low
            print("Data Timer Expired, Run Command Again.");
            gui.Timer.Stop();//stop timer
            gui.Timer.Enabled = false; //event over
            timerlength = 5000;//reset timer

        }
    }

串口读取数据,请假设串口设置正确,因为任何不使用定时器的传输或接收数据都可以正常工作。

            if (flag == true)
            {
              //code to read data in, and parse to display in text boxes correct 
              flag = false; 
            }

其他重要说明:

  • 我可以从设备中获得三种类型的数据,因此我使用 if/else 和相应按钮设置的标志。因此,“标志”变量的全局声明。

  • 我没有检测到串行端口获取可能让我失望的垃圾数据的问题,我已经运行并分析了足够多的数据以知道我得到了正确的预期数据。

  • 当设备关闭时,这个计时器也是完美的,并且会持续整整五秒钟然后到期。

4

1 回答 1

1

没有足够的代码进行调用。但是有两个基本问题很突出:您可以启用一个可能已经启用的计时器。这没有任何作用,您的计时器将过早到期。还有一个更严重的问题,你不断添加事件处理程序。因此,如果计时器到期,那么 Tick 事件处理程序将运行多次。

您只需订阅一次 Tick 事件,在您的类的构造函数中执行此操作。

并且您必须确保在启动之前禁用计时器。通过在 Tick 事件处理程序中以及在您收到响应时将其 Enabled 属性设置回 false 来执行此操作。想必后者不见了。当它已经启用 btnGetData_Click() 方法时引发 InvalidOperationException,因为如果是这种情况,这是一个逻辑错误。或者如果放弃尝试获得响应是合法的,则首先强制启用 = false。

于 2013-04-28T15:10:57.317 回答