Timer receive_timer;
        Timer send_timer;
                public Serial_Xray()
        {
            port=new SerialPort();
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            receive_timer= new Timer();
            send_timer = new Timer();
                        receive_timer.Interval = 500;
            receive_timer.Tick += new System.EventHandler(this.receive_timer_Tick);
            
            
            send_timer.Interval = 1000;
            send_timer.Tick += new System.EventHandler(this.send_timer_Tick);            for (int i = 0; i < 1024; i++)
            {
                readbuffer[i] = 0;
            }
            
        }
        public override void CMD_Send(byte[] cmd)
        {
            try
            {
                port.Write(cmd, 0, cmd.Length);
                receive_timer.Enabled = true;
            }
            catch (Exception e)
            {
                On_Error(e.ToString());
            }
        }       private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //send_timer.Enabled = false;
           
            int len;
            len = port.Read(readbuffer, 0, 1024);
            send_timer.Enabled = false;
            receive_timer.Enabled = false;
            On_Receive(readbuffer);            if (Tell_CMD(readbuffer, len))
            {
                receive_timer.Enabled = false;
            }
            else
            {
                receive_timer.Enabled = true;
            }        }

解决方案 »

  1.   

        receive_timer.Tick += new System.EventHandler(this.receive_timer_Tick);   send_timer.Tick += new System.EventHandler(this.send_timer_Tick);在哪呢?
      

  2.   

            private void receive_timer_Tick(object sender, EventArgs e)
            {
                receive_timer.Enabled = false;
                On_Error("正しいコマンドが来ていません");
                CMD_POS = 0;
            }        private void send_timer_Tick(object sender, EventArgs e)
            {
                send_timer.Enabled = false;
                On_Error("通信問題が行い、確認してください");
                CMD_POS = 0;     
            }
    按下按钮的话。实现···CMD_send()函数。有代码进来时关掉计时。问题是没有代码进来,但是timer的事件内容也不实现
      

  3.   


           private void receive_timer_Tick(object sender, EventArgs e)
            {
                receive_timer.Enabled = false;
                On_Error("正しいコマンドが来ていません");
                CMD_POS = 0;
            }        private void send_timer_Tick(object sender, EventArgs e)
            {
                send_timer.Enabled = false;
                On_Error("通信問題が行い、確認してください");
                CMD_POS = 0;     
            }
    按下按钮的话。实现···CMD_send()函数。有代码进来时关掉计时。问题是没有代码进来,但是timer的事件内容也不实现
      

  4.   

    c#里一共有3个Timer  System.Timers.Timer,线程,控件。你用的应该是第一个,请问你的
     receive_timer.Start() 在哪?
      

  5.   

    Timer应该是在初使化时去定义,在用到Timer时Enabled 直接设置为True
        public Serial_Xray()
            {
                port=new SerialPort();
                port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);                        receive_timer.Enabled = True;            
                
                send_timer.Enabled = True;
                for (int i = 0; i < 1024; i++)
                {
                    readbuffer[i] = 0;
                }
                
            }
      

  6.   


    上面·receive_timer.enabled=true;那个就是start啊 
      

  7.   


    我这个是个class 新建这个class的时候定义不是一样的吗 ??有什么区别。
      

  8.   

    区别在于你的receive_timer定义在外边(全局对象),每定义一次就会被本次所复盖,你认为之前的send_timer.Enabled = True还会存在吗?
      

  9.   


    不好意思我没看懂。。
    你说的再定义是new吗?不好意思我刚学。不是很懂。。
    定义的话一般是在外面定义,然后class 生成的时候对他进行初始化。使用class 的时候我也只是做一次new,然后利用里面的函数啊
      

  10.   


    上面·receive_timer.enabled=true;那个就是start啊 
    刚才看错了,你用的是控件Timer Enable是说控件有效,但是你并没有启动定时器呀,所以要调用timer.Start();
      

  11.   


    上面·receive_timer.enabled=true;那个就是start啊 
    刚才看错了,你用的是控件Timer Enable是说控件有效,但是你并没有启动定时器呀,所以要调用timer.Start();timer.start()和enabled是一样的吧,一个是改属性,一个用函数
      

  12.   

    解决了换成 system.timers的timer就可以了 。
      

  13.   

    如果将 Enabled 设置为 true 并将 AutoReset 设置为 false,则 Timer 在第一次达到间隔时仅引发一次 Elapsed 事件。当 Enabled 为 true 并且 AutoReset 为 true 时,Timer 继续按指定的间隔引发 Elapsed 事件。
    还可以通过将 Enabled 设置为 true 开始计时。说明:
    如果 AutoReset 为 false,则必须调用 Start 方法才能再次开始计数。
      

  14.   


    嗯 谢谢。forms的timer没有autoReset这个属性。所以我用systems 的timer,吧autoreset改成true的就好了。`