Files
IOT_SIM/samples/p5-t2-烟雾/task.md
T
xuyueandClaude Opus 5.5 d4b8bf9241 任务说明补齐 23 份;设计器支持窗体改名
- 其余 21 个实验的 task.md:控件名照示例代码,"在平台上怎么试"和评分步骤一致,列出书上的印刷错误和控件名不一致
- 窗体改名:属性窗口里选中窗体可以改名称,类名、构造函数、new X()、Program.cs 和两个文件名一起改;方法名和字符串不变
- 11 个主窗体不叫 Form1 的实验,任务说明提示先改窗体名再双击生成 Load 事件
- 测试:表头只认分隔行上面那一行,数据行里出现"名称"不再被当成表头

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:55:39 +08:00

3.0 KiB
Raw Blame History

任务目标

和任务 1 一样监测灾情,这次读的是烟雾传感器,而且不用定时器,改用线程:线程里用 while 循环每 2 秒读一次烟雾传感器,显示时间和"发现烟情"或"正常"。点"关闭"时把线程挂起,再点"开启"让线程继续,关闭窗体时终止线程。

练习重点:while 循环、线程 Thread(Start、Suspend、Resume、Abort、Thread.Sleep)、窗体的 FormClosing 事件。详细步骤见书 p98–101。

界面和控件名

控件 名称(Name) 文字(Text)和用途
窗体 Form1 烟雾
标签 lbl_port 串口
下拉框 com_port ADAM-4150 的串口
按钮 btn_open 开启(打开后变成"关闭")
分组框 groupBox1 数据显示
标签 lbl_time 时间
文本框 txt_time 显示当前时间
标签 lbl_even 事件
文本框 txt_even 显示有没有烟情

界面和任务 1 一样,但没有定时器。书上的表格里没有分组框,照图加一个 groupBox1(数据显示)。

实现步骤

  1. 代码开头加上 using System.IO.Ports;、using DeviceCtrlLibrary;、using System.Threading;。
  2. 声明全局变量:bool IsOpen = false;、bool IsFirst = true;(线程是不是第一次启动)、Thread thd;。
  3. 写线程要运行的方法 GetData():while (true) 循环里,adam4150Helper.SetData().smokeValue 是 true 就显示"发现烟情",否则显示"正常",两种情况都把当前时间写进 txt_time;每次循环最后 Thread.Sleep(2000)。
  4. Form1_Load:这次用 foreach 把串口号加进 com_port;然后 thd = new Thread(GetData);,再写 Control.CheckForIllegalCrossThreadCalls = false;,允许线程直接改窗体上的控件。
  5. btn_open 的 Click:先把 IsOpen 取反。
    • 打开时:打开 ADAM-4150 串口,按钮改成"关闭";IsFirst 是 true 就把它改成 false 并 thd.Start(),否则 thd.Resume();
    • 关闭时:关闭串口,按钮改回"开启",thd.Suspend()。
  6. Form1 的 FormClosing:终止线程(见下面"和书上不一样的地方")。在设计器里选中窗体,到 ⚡ 事件 里双击 FormClosing 生成方法。

和书上不一样的地方

关闭窗体时先让线程继续:书上 FormClosing 里直接 thd.Abort();。如果点过"关闭",线程正处于挂起状态,直接终止会出错(在真的 Visual Studio 里也一样)。要先判断 thd.ThreadState == ThreadState.Suspended,是的话先 thd.Resume();,再 thd.Abort();。

在平台上怎么试

  1. 运行后串口选 COM3(ADAM-4150),点"开启",按钮变成"关闭","时间"框开始走。
  2. 在实训台上把烟雾传感器点成"有烟雾",几秒内"事件"框显示"发现烟情";点回"正常",显示"正常"。
  3. 点"关闭","时间"框应停住不动;再点"开启",时间接着走,烟雾状态也继续更新。
  4. 点"关闭"之后直接关掉窗体,不应弹出错误。