2015-06-22 90 views
-2

我有C#/ .NET程序使用COM端口和SQL CE數據庫與WCF服務。有時程序變得沒有響應(窗口凍結),甚至在調試模式下,我不能這麼做。C#程序與COM端口不響應

我可以重新啓動我的電腦或COM端口後重新啓動程序。問題不在於我的COM端口問題,因爲我在許多PC上嘗試過它,並且都有同樣的問題。

我該如何解決這個問題?

private void timer_Tick(object sender, EventArgs e) 
{ 
    try 
    { 
     labeltimer.Text = DateTime.Now.ToString(); 
     if (timerstarted == true) 
     { 
      return; 
     } 
     timerstarted = true; 
     _CARDCODE = 0; 
     string error = ""; 
     bool hasbassed = false; 
     if (this._Close == true) 
     { 
      this.Close(); 
     } 

     if (serialPort1.IsOpen) 
     { 
      if (i < 8) 
      { 
       i++; 
      } 
      else 
      { 
       i = 0; 
      } 
      to[0] = (byte)(128 + i); 
      try 
      { 
       serialPort1.Write(to, 0, 1); 
      } 
      catch (System.Exception ex) 
      { 
       ListViewItem Lvi = new ListViewItem((++rowcount).ToString()); 
       Lvi.SubItems.Add(""); 
       Lvi.SubItems.Add(""); 
       Lvi.SubItems.Add("Disconnected"); 
       Lvi.SubItems.Add(""); 
       listView.Items.Add(Lvi); 
       StartPort(); 
      } 


      if (progressBar.Value >= 1500) 
       progressBar.Value = 0; 
      else 
       progressBar.Value += 10; 

      if (serialPort1.BytesToRead != 0) 
      { 

       byte[] data = new byte[serialPort1.BytesToRead]; 
       from = new byte[3]; 
       try 
       { 
        serialPort1.Read(data, 0, data.Length); 
       } 
       catch (System.Exception ex) 
       { 
        ListViewItem LVi = new ListViewItem((++rowcount).ToString()); 
        LVi.SubItems.Add(""); 
        LVi.SubItems.Add(""); 
        LVi.SubItems.Add("Disconnected"); 
        LVi.SubItems.Add(""); 
        listView.Items.Add(LVi); 
        StartPort(); 
       } 
       // data.Length == 4 by Button or HassPassed 
       if (data.Length == 4) 
       { 
        if (data[1] > 2) 
         DBS.AddButtonPass(data[0], data[1]/4); 
        else 
        { 
         DBS.EditPass((int)data[0]); 
         timerstarted = false; 
         return; 
        } 

       } 
       else if ((data[data.Length - 1] != 255) || (data.Length < 4)) 
       { 
        from[0] = data[0]; 
        from[1] = 0; 
        from[2] = 0; 
        serialPort1.Write(from, 0, 3); 
        timerstarted = false; 
        return; 
       } 

       //RegistoringSubscriber_ID Add Subscriber Card 
       else if ((RegistoringSubscriber_ID > 0) && (RegisterCheckpoint != 0) && (data[0] == RegisterCheckpoint)) 
       { 
        Registoring = false; 
        if (RegistorNewCard(Convert.ToInt32(data[2].ToString() + data[3].ToString() + data[4].ToString())) > 0) 
         FormBringPC.AnswerType = 1; 
        else 
         FormBringPC.AnswerType = 2; 
        RegistoringSubscriber_ID = 0; 

        error = "register card"; 
       } 
       // RegistoringSubscriber_ID < 0 Add Bonus Card 
       else if ((RegistoringSubscriber_ID < 0) && (RegisterCheckpoint != 0) && (data[0] == RegisterCheckpoint)) 
       { 
        Registoring = false; 
        if (RegistorBonusCard(Convert.ToInt32(data[2].ToString() + data[3].ToString() + data[4].ToString())) > 0) 
         FormBringPC.AnswerType = 1; 
        else 
         FormBringPC.AnswerType = 2; 
        RegistoringSubscriber_ID = 0; 

        error = "register Bonus card"; 
       } 
       else if ((List_Checkpoint_ID.Contains(data[0]) && ((data[1] == 130) || (data[1] == 129)))) 
       { 
        //  DBS.EditPass((int)data[0]); 
       } 
       else if ((List_Checkpoint_ID.Contains(data[0]) && (data.Length == 7))) 
       { 
        _CARDCODE = Convert.ToInt32(data[2].ToString() + data[3].ToString() + data[4].ToString()); 
        GlobalTypes.InvalidPass pass = DBS.CheckPassStatus(_CARDCODE, (int)data[0], (int)data[1]); 
        if (pass == GlobalTypes.InvalidPass.Valid) 
        { 
         from[0] = data[0]; 
         from[1] = 1; 
         from[2] = 1; 
         serialPort1.Write(from, 0, 3); 
         LBTitle.Text = DateTime.Now.ToLongTimeString(); 
         hasbassed = true; 
        } 
        else 
        { 
         from[0] = data[0]; 
         from[1] = 0; 
         from[2] = 0; 
         serialPort1.Write(from, 0, 3); 
         switch (pass) 
         { 
          case GlobalTypes.InvalidPass.InvalidCard: 
           { 
            error = "Չգրանցված քարտ"; 
            break; 
           } 
          case GlobalTypes.InvalidPass.InvalidCount: 
           { 
            error = "Այց. քանակ"; 
            break; 
           } 
          case GlobalTypes.InvalidPass.InvalidGraphic: 
           { 
            error = "Ժամանակ hh:mm:ss"; 
            break; 
           } 
          case GlobalTypes.InvalidPass.InvalidPeriod: 
           { 
            error = "Ժամանակահատված xxxx.dd.yyy"; 
            break; 
           } 
          case GlobalTypes.InvalidPass.InvalidStatus: 
           { 
            error = "Հառացված աբոնենտ"; 
            break; 
           } 
          case GlobalTypes.InvalidPass.InvalidSuscribe: 
           { 
            error = "Անհայտ բաժանորդ"; 
            break; 
           } 
          default: 
           { 
            error = "esim inch"; 
            break; 
           } 
         } 
        } 
       } 
       else if ((List_Checkpoint_ID.Contains(data[0]) && (data.Length > 0))) 
       { 
        try 
        { 
         byte[] ticket = new byte[data.Length - 6]; 

         for (int ii = 0; ii < data.Length - 6; ii++) 
         { 
          ticket[ii] = data[ii + 2]; 
         } 

         _CARDCODE = Convert.ToInt32(Encoding.ASCII.GetString(ticket.ToArray())); 
         GlobalTypes.HasPass pass = DBS.CheckTicketPassStatus(_CARDCODE, (int)data[0], (int)data[1]); 
         if (pass == GlobalTypes.HasPass.TruePass) 
         { 
          from[0] = data[0]; 
          from[1] = 1; 
          from[2] = 1; 
          serialPort1.Write(from, 0, 3); 
          LBTitle.Text = DateTime.Now.ToLongTimeString(); 
          hasbassed = true; 
         } 
         else 
         { 
          from[0] = data[0]; 
          from[1] = 0; 
          from[2] = 0; 
          serialPort1.Write(from, 0, 3); 
          switch (pass) 
          { 
           case GlobalTypes.HasPass.CardNotFound: 
            { 
             error = "Not registored ticket"; 
             break; 
            } 
           case GlobalTypes.HasPass.CardRepeat: 
            { 
             error = "ReEntring"; 
             break; 
            } 
           case GlobalTypes.HasPass.ValidationPeriodError: 
            { 
             error = "Ժամանակ hh:mm:ss"; 
             break; 
            } 
           case GlobalTypes.HasPass.SeasonError: 
            { 
             error = "Ժամանակահատված xxxx.dd.yyy"; 
             break; 
            } 
           case GlobalTypes.HasPass.WeekOfDayError: 
            { 
             error = "Day of Weak"; 
             break; 
            } 
           default: 
            { 
             error = "esim inch"; 
             break; 
            } 
          } 
         } 
        } 
        catch { timerstarted = false; return; } 
       } 
       if (rowcount >= 10) 
       { 
        rowcount = 0; 
        listView.Items.Clear(); 
       } 
       ListViewItem lvi = new ListViewItem((++rowcount).ToString()); 
       lvi.SubItems.Add(data[0].ToString()); 
       if (data.Length == 4) 
        hasbassed = true; 
       if (((data[1] == 2) || (data[1] == 8)) && ((data.Length == 4) || (Dictionary_Chekpoint[data[0]].CheckPointType == 2))) 
       { 
        lvi.SubItems.Add("Ելք"); 
       } 
       else 
       { 
        lvi.SubItems.Add("Մուտք"); 
       } 
       if (data.Length != 4) 
        lvi.SubItems.Add(_CARDCODE.ToString()); 
       else 
        lvi.SubItems.Add("Հերթապահ"); 
       lvi.SubItems.Add(error); 
       if (hasbassed == true) 
       { 
        lvi.BackColor = Color.LightGreen; 
       } 
       else 
       { 
        lvi.BackColor = Color.LightPink; 
       } 
       listView.Items.Add(lvi); 
      } 
     } 
     else MessageBox.Show("Serial port is closed!", "RS232 tester", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     timerstarted = false; 
    } 
    catch 
    { 
     timerstarted = false; 
     return; 
    } 

}

+2

尋求調試的問題幫助(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身**中重現它所需的**最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建一個最小,完整和可驗證的示例。](http://stackoverflow.com/help/mcve) – cubrr

+0

是這樣嗎?這是我的代碼 –

+0

即使您無法隔離問題的位置,您至少可以在串口調用周圍添加一些日誌,以找出哪個日誌阻塞了您的應用程序主線程。這將允許您提供一小段代碼來說明您的問題,而不是傾銷您的整個代碼,期望我們能夠完成您的工作。我也很確信Justin是正確的,並且你正在GUI線程中進行串口阻塞調用。 –

回答

2

C#程序表明,每當有處理髮生在阻止UI處理的主UI線程的不響應。這裏的一般答案是將該工作推入不同的線程,以便UI事件可以繼續處理(請參閱下面的參考資料以獲取更多信息)。在串行端口的情況下,最容易做的事情是掛鉤的,而不是輪詢SerialPort.DataReceived事件吧:https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx

編號:

GUI not responding while fetching data

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/dd744765%28v=vs.85%29.aspx

http://www.dreamincode.net/forums/topic/246911-c%23-multi-threading-in-a-gui-environment/

+0

這不能幫助我,因爲,我的用戶界面並不重要,重要的是程序,該答案在數據庫上的COM端口讀取/寫入,如果用戶界面的作品,但我的第二個threade沒有反應,這不會幫助我,我需要解決問題, –

+0

我現在將讀取有關串口的信息,謝謝 –

+1

如果UI不重要,那麼應該考慮將代碼重寫爲服務而不是WinForms應用程序。 – Justin