我目前正在进行一个项目,我正在使用Visual studio 2010 c#中的SerialPort库从定制PCB读取数据。
我目前正试图通过按钮单击从设备读取某种类型的数据给我作为数据字节,并等待五秒钟,如果没有设备响应,则超时。
然而,由于某种原因,计时器是有故障的,并且经常在五秒钟之前过期,从而阻止有效的数据被存储。下面是我使用的代码,有人能指出我的缺陷吗?我怀疑事件定时器函数从System.Windows.Forms。我使用的定时器是不正确的。
按钮单击
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的由相应的按钮设置的标志。因此,全局声明'flag'变量。
我没有检测到串行端口获得垃圾数据的问题,可能会让我离开,我已经运行并分析了足够的数据,以知道我得到正确的预期数据。
这个定时器在设备关闭时也是完美的,并且会持续整整五秒然后过期。
没有足够的代码来进行调用。但是有两个基本问题突出:您可以启用一个可能已经启用的计时器。它什么都不做,你的计时器很快就会过期。更严重的问题是,您不断添加事件处理程序。因此,如果计时器到期,那么Tick事件处理程序将运行多次。
你只需要订阅一次Tick事件,在你的类的构造函数中这样做。
你必须确保定时器在你启动它之前是被禁用的。通过在收到响应时将Tick事件处理程序和中的Enabled属性设置回false来实现。想必后者是缺失的。当它已经在btnGetData_Click()方法中启用时,引发InvalidOperationException,因为如果是这种情况,这是一个逻辑错误。如果放弃尝试获取响应是合法的,则首先强制启用= false