2016-12-28 101 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方法之后等待一定的时间,作为端口可能不会立即关闭。

我的解决方案是保持连接活着并更改波特率并手动更新我的应用程序中的连接状态。