我目前正在开展一个项目,我正在使用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's和相应按钮设置的标志。因此'flag'变量的全局声明。
我没有检测到串口获取垃圾数据的问题可能会让我失望,我已经运行并分析了足够的数据,以便知道我得到了正确的预期数据。
当设备关闭时,此计时器也完美无缺,并且将持续整整五秒钟然后过期。
答案 0 :(得分:1)
没有足够的代码来拨打电话。但是有两个基本问题突出:您可以启用可能已启用的计时器。哪个什么都不做,你的计时器会过早到期。还有一个更严重的问题,你不断添加事件处理程序。因此,计时器到期,然后Tick事件处理程序将多次运行。
您需要只订阅一次Tick事件,在您的类的构造函数中执行此操作。
您必须确保在启动计时器之前禁用计时器。通过在收到响应时在Tick事件处理程序和中将其Enabled属性设置为false来执行此操作。据推测后者缺失了。当它已经启用了btnGetData_Click()方法时,引发InvalidOperationException,因为如果是这种情况,它是一个逻辑错误。如果放弃获得回复的尝试是合法的,则首先强制启用= false。