我目前正在进行一个项目,在这个项目中,我正在使用SerialPort库从一个定制的PCB读取数据,该库位于VisualStudio2010 c#。
目前,我正试图通过单击按钮从设备读取作为字节数据提供给我的特定类型的数据,如果设备没有响应,则等待5秒才会超时。
但是,由于某种原因,计时器出现故障,并且通常在5秒之前过期,从而阻止有效数据的存储。下面是我的代码,有人能指出我的缺陷吗?我怀疑来自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;
}其他重要注释:
发布于 2013-04-28 15:10:57
没有足够的代码打电话。但是有两个突出的基本问题:您可以启用可能已经启用的计时器。你的计时器太快过期了。更严重的问题是,您一直在添加事件处理程序。因此,计时器过期,则Tick事件处理程序将多次运行。
您只需要订阅一次蜱事件,就可以在类的构造函数中订阅。
在启动之前,你必须确保计时器是禁用的。通过将其启用的属性设置为false事件处理程序中的false,以及在收到响应时执行此操作。据推测,后者已经消失了。当InvalidOperationException已经启用时引发它-- btnGetData_Click()方法,因为如果是这样的话,它是一个逻辑错误。如果放弃获得响应的尝试是合法的,则先强制启用= false。
https://stackoverflow.com/questions/16259897
复制相似问题