制作图书馆环境监控系统遇到的问题

一,窗体控件闪烁
把窗体DoubleBuffer属性改为 true,绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁。
二,运行时窗体闪烁
在代码中添加

   //解决窗体运行时闪烁的问题
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        }

三,图片自适应窗体
把窗体backgroundmagelayout 属性改为Stretch。
四,让控件跟随窗体一起改变
把Anch设置为none;
AutoScaleMode属性设置为Dpi,可以相对于屏幕确定控件或窗体的大小,例如,对于显示图表或其他图形的控件,可能希望使用每英寸点数(DPI)缩放,以便该控件始终占据一-定百分比的屏幕
AutoScaleMode属性设置为Dpi之后,最好还要搭配另外三个属性来控制窗体的大小。如下:
1.Autosize=false,设置窗体不根据内容超出而调整窗体自身大小,以免窗体超出屏幕。
2.AutoScroll=true,设置窗体当内容超出窗体时,自动产生滚动条。这样用户依靠滚动条既可以完全看到超出窗体的内容了。
3.MaximizeBox=true,可设置窗体最大化,当窗体超.出屏幕时,用户可设置窗体最大化来让窗体尺寸贴合用户屏幕。
五,两个控件的值进行比较,控件的值是string型,不能直接进行比较
把值转换成double型来比较

             if (checkBox1.Checked)//判断勾选框是否被勾选
                    {
                       //把控件的值转换成double型进行比较
                         if (Convert.ToDouble(label3.Text) >= Convert.ToDouble(textBox2.Text);
                               {
                                     Openfeng();//调用打开风扇的函数
                               }
                         if (Convert.ToDouble(label3.Text) <= Convert.ToDouble(textBox3.Text))
                               {
                                      Closefeng();//调用关闭风扇的函数
                                }
                     }

六,跳转窗体

            serialPort1.Close();           //关闭串口默认为COM1
            controlpage formAdmin = new controlpage();
            formAdmin.Show();
            this.Hide();

七,弹出窗口

 MessageBox.Show("此刻光照过暗!");

八,延时函数

 System.Threading.Thread.Sleep(2000);

九,串口接收数据
1.在窗体中加入serialPort控件,把波特率设为38400,默认com1;
2.在serialPort的DataReceived事件勾选serialPort1_DataReceived;
3.在窗体运行时打开串口

     private void controlpage_Load(object sender, EventArgs e)
        {
          //  serialPort1.Open();           //打开串口默认为COM1
     
        }

4.编写串口接收函数

//串口接收数据后处理函数
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                //判断数据头是否正确(0xfd开头),正确就进入循环
                while (serialPort1.ReadByte() == 0xff && serialPort1.ReadByte() == 0xfd)
                {                
                    byte[] A = new byte[1024 * 1024];
                    int a = serialPort1.ReadByte();                   //把第三个数据赋值给a
                    for (int i = 0; i < 8; i++)
                    {
                        A[i] = (byte)serialPort1.ReadByte();          //循环读取数据并存到数组A
                    }
                    switch (a)
                    {
                        case 0x00://光照
                            {
                                double x = Convert.ToDouble((Char)A[1] + "." + (Char)A[2]);// 前两位为电压的ascii码值
                                double y = x * 1000 / 3.3;
                                label2.Text = y.ToString("0.00");//label是string型,把double型的转换成string型
                                if (Convert.ToDouble(label2.Text) >= Convert.ToDouble(sqlStr3))
                                {
                                    label2.BackColor = Color.FromArgb(255, 0, 0);//当光照大于预定值把控件背景改成红色
                                    CloseLight();//光照过强关闭灯光                                
                                }
                                if (Convert.ToDouble(label2.Text) <= Convert.ToDouble(sqlStr4))
                                {
                                    label2.BackColor = Color.FromArgb(0, 0, 255);//当光照小于预定值把控件背景改成蓝色
                                    Openlight();//光照过暗打开灯光                                  
                                }
                                else
                                {
                                    label2.BackColor = Color.Transparent;//光照正常时把控件背景恢复透明
                                }
                            } break;
                        case 0x01://温湿度
                            {
                                //byte5~ byte6为温度值,byte7~ byte8为湿度度值,byte5、byte7为整数部分,byte6、byte8为小数部分,
                                label4.Text = A[1] + "." + A[2]; //温度                               
                                label12.Text = A[3] + "." + A[4];//湿度                                
                                if (Convert.ToDouble(label3.Text) >= Convert.ToDouble(sqlStr1))
                                {
                                    label4.BackColor = Color.FromArgb(255, 0, 0);//当温度大于预定值把控件背景改成红色
                                    Openfeng();  //打开风扇                            
                                }
                                if (Convert.ToDouble(label3.Text) <= Convert.ToDouble(sqlStr2))
                                {
                                    label4.BackColor = Color.FromArgb(0, 0, 255);//当温度小于预定值把控件背景改成蓝色
                                    Closefeng();//关闭风扇                          
                                }
                                else
                                {
                                    label4.BackColor = Color.Transparent;//温度正常时把控件背景恢复透明                                 
                                }
                            } break;
                        case 0x03://火焰
                            {
                                double x = Convert.ToDouble((Char)A[1] + "." + (Char)A[2]);// 前两位为电压的ascii码值
                                double y = x * 1000 / 3.3;
                                label6.Text = y.ToString("0.00");//label是string型,把double型的转换成string型
                                if (y >= 1)
                                {
                                    label6.BackColor = Color.FromArgb(255, 0, 0);//检测到火情的时候把控件变为红色
                                    Openlight();//打开报警灯
                                }
                                else
                                {
                                    label6.BackColor = Color.Transparent;//没有火情的时候控件背景恢复透明
                                }
                            } break;
                        case 0x06://人体
                            {
                                if (A[1] == 0)//人体感测器:前一位(byte5)为传感器值,0表示有人,非零表示无人,后三位无效.
                                {
                                    label8.Text = "有人";                                 
                                }
                                else
                                {
                                    label8.Text = "无人";
                                    label8.BackColor = Color.FromArgb(255, 0, 0);//图书馆无人自动关灯
                                }
                            } break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception)
            {
                ;
            }
        }

十,控制风扇灯亮/关

        private void Openlight()//控制灯亮
        {
            byte[] bts = new byte[] { 0xFA, 0xFB, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
            serialPort1.Write(bts, 0, bts.Length);
        }
        private void CloseLight()//控制灯灭
        {
            byte[] bts = new byte[] { 0xFA, 0xFB, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 };
            serialPort1.Write(bts, 0, bts.Length);
        }
        private void Openfeng()//打开风扇
        {
            byte[] bts = new byte[] { 0xFA, 0xFB, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
            serialPort1.Write(bts, 0, bts.Length);
        }
        private void Closefeng()//关闭风扇
        {
            byte[] bts = new byte[] { 0xFA, 0xFB, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 };
            serialPort1.Write(bts, 0, bts.Length);
        }

十一,往数据库里存东西

 private void lianjie()//把数据存到数据库
        {
            SqlConnection sqlConn = null;
            try
            { 
                DateTime time = DateTime.Now;//获取现在的时间
                //定义连接字符串
                String connStr = "Data Source=.;Initial Catalog=tushuguan;Integrated Security=True";
                //定义Connection对象,建立与数据库连接
                sqlConn = new SqlConnection(connStr);
                //连接数据库
                sqlConn.Open();
                //定义SQL语句
                String sqlStr = "insert into chaxun(sensor,date,data)values('光照',@date,@data)";
                //定义comman对象
                SqlCommand cmd1 = new SqlCommand(sqlStr, sqlConn);
                //将e赋给查询语句中user这个占位符("@date")
                cmd1.Parameters.Add(new SqlParameter("@date", time.ToString()));               
                //将 label3.Text的值赋给查询语句中user这个占位符("@data").
                cmd1.Parameters.Add(new SqlParameter("@data", this.label3.Text.Trim()));
                int res1 = cmd1.ExecuteNonQuery();
                if (res1 != 0)
                {  ;  }
                else
                {
                    MessageBox.Show("错误");
                }
                Task.Delay(1000);//延时向数据表插入数据
            }
            catch (Exception ex)
            {
                MessageBox.Show("访问数据库错误: " + ex.Message);
            }
            finally
            {
                if (sqlConn!=null)
                {
                    sqlConn.Close();
                }
            }
        }     

十二,从数据库里面查询历史数据

 private void chaxun()
        {
            //获取查询条件
            SqlConnection sqlConn = null;
            try
            {
                //运用Connection对象建立与数据库的连接
                String connStr = "Data Source=.;Initial Catalog=tushuguan;Integrated Security=True";
                //定义Connection对象,建立与数据库连接
                sqlConn = new SqlConnection(connStr);         
                //连接数据库
                sqlConn.Open();
                //利用Command对象执行sql语句
                String sqlStr = @"select serial,sensor,date,data from chaxun  where date>=@start and date<=@end and sensor=@sensor";
                ////定义Command对象
                SqlCommand cmd = new SqlCommand(sqlStr, sqlConn);
                ////建立参数与参数类型
                cmd.Parameters.Add(new SqlParameter("@start", this.dateTimePicker1.Value.ToShortDateString()));
                cmd.Parameters.Add(new SqlParameter("@end", this.dateTimePicker2.Value.ToShortDateString()));
                cmd.Parameters.Add(new SqlParameter("@sensor", this.comboBox1.Text.Trim()));
                SqlDataAdapter adp = new SqlDataAdapter();
                adp.SelectCommand = cmd;
                //将查询结果存入DataSet中
                DataSet ds = new DataSet();
                adp.Fill(ds, "tushuguan");
                this.dataGridView1.DataSource = ds.Tables["tushuguan"];
            }
            catch (Exception ex)
            {
                MessageBox.Show("访问数据库错误: " + ex.Message);
            }
            finally
            {
                if (sqlConn != null)
                {
                    sqlConn.Close();
                }
               
            }  
        }

十三,窗体之间传值
1.在一个app类中定义一个静态成员value

public class app
{
public static string value;
}

2.在窗体Form1中这样调用

app.value = "f2";//给静态成员赋值
//new Form2 ( ).Show( ); //多打开一个窗口

3.在窗体Form2中

this.Text =app.value; //取回app.value的值
//app.value ="Form2"; //给app.value赋初值,以便其他窗体调用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272