2016-12-28 105 views
0

在我的應用程序中,我使用的是9600波特率串行連接,我希望使用115200波特率連接進行數據傳輸。將串行連接重置爲不同波特率後的異常

我已經從舊連接斷開並將其設置爲空值,並將串行連接設置爲具有不同波特率的新連接。

連接不穩定,我有時會得到System.ObjectDisposedException - 我錯過了什麼?

連接碼

public string startConnection() 
    { 
     if (serial != null) 
     { 
      serial.Dispose(); 

     } 

     foreach (string portname in SerialPort.GetPortNames()) 
     { 
      serial = new SerialPort(portname, 9600, Parity.None, 8, StopBits.One); 
      serial.ReadTimeout = 5000; 
      serial.WriteTimeout = 5000; 
      serial.Handshake = System.IO.Ports.Handshake.None; 
      serial.NewLine = "\n"; 
      string received = ""; 

      try 
      { 
       serial.Open(); 
       serial.DiscardInBuffer(); 
       serial.Write(":09;BATTERY;"); 
       Thread.Sleep(500); 
       received = serial.ReadLine(); 

       if (received.Contains(";BATTERY;V=")) 
       { 
        status = SERIAL_CONNECTED; 
        return portname; 
       } 
      } 
      catch (Exception err) 
      { 
       try 
       { 
        serial.Close(); 
        status = DISCONNECTED; 
       } 
       catch (Exception) 
       { 
       // throw; 
       } 
      } 
     } 

     throw new Exception("couldn't connect to coms"); 
     //return "couldn't connect to coms"; 

     //this.Close(); 
    } 

斷開功能:

public void disconnect() 
    { 

     if (serial == null || serial.IsOpen==false ||status == DISCONNECTED) 
      return; 

     status = DISCONNECTED; 
     serial.Close(); 
     serial = null; 
    } 

主程序是:

private async void BurnOFP_click(object sender, RoutedEventArgs e) 
    { 
      startConnection(); 
      some actions............. 

      disconnect(); 

      var t = new Task(() => 
       { 
        try 
        { 
        myUswm.startModemConnection(); // same but with different baud rate 
        } 
        catch (Exception e2) { MessageBox.Show(e2.Message); } 
       }); 
      t.Start(); 
      t.Wait(); 

      modem = new XMODEM_FullDotNET(myUswm.getSerialPort(), XMODEM_FullDotNET.Variants.XModemCRC); 



      buff = File.ReadAllBytes(softwareFilePath_Text.Text); 
      if (buff.Length < 1) 
      { 
       MessageBox.Show("ERROR : wrong OFP file"); 
       return; 
      } 

      if (myUswm.prepareOFPBurning()) // sends u to start transfer 
      { 

       if (isBurning == false) 
       { 
        isBurning = true; 

        modem._ProgressSent = 0; 
        myProgBar = new myProgressBar(modem); 
        myProgBar.StartTransfer(modem, buff.Length); 
        myProgBar.Show(); // show window 

        // got the Exception here!!!!!!!!!! 
        var t3 = new Task(() => 
        { 
         modem.Send(buff); 
        }); 
        ............ 

       } 
       else 
        MessageBox.Show("burning in progress.."); 
      } 
     } 
     catch (Exception e1) 
     { 
      MessageBox.Show(e1.Message); 
     } 

    } 

感謝您的幫助

+0

你想用你的設備在9600波特率和115200波特率上進行通信嗎?你是否將設備UART更改爲支持115200? 這是什麼意思「不穩定」,你在哪裏得到'System.ObjectDisposedException'? 順便說一句 - 如果你只是等待它完成,爲什麼你使用異步任務的'myUswm.startModemConnection()'? – idanp

+0

1.我改變了UART支持。 2.不穩定意味着有時我得到了異常,而不是。 3.關閉串行連接後,我得到異常,並在同一端口上用新的串行連接重新打開它。這是connect方法的一箇舊實現。在異步任務中沒有任何意義。 –

回答

0

ř ESOLVED

我的問題是關閉並重新打開相同的端口造成的時間不正確。

我發現在MSDN串行類的信息:

任何應用程序的最佳做法是試圖調用Open方法之前調用Close方法之後等待一定的時間,作爲端口可能不會立即關閉。

我的解決方案是保持連接活着並更改波特率並手動更新我的應用程序中的連接狀態。