将串行连接重置为不同的波特率后出现异常

时间:2016-12-28 16:56:43

标签: c# serial-port

在我的应用程序中,我使用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);
        }

    }

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

<强>分辨

我的问题是关闭并重新打开同一个端口导致的错误时间。

我在MSDN Serial类中找到了这些信息:

  

任何应用程序的最佳做法是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。

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