Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将串行连接重置为不同波特率后出现异常_C#_Serial Port - Fatal编程技术网

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

C# 将串行连接重置为不同波特率后出现异常,c#,serial-port,C#,Serial Port,在我的应用程序中,我使用9600波特率串行连接,我想使用115200波特率连接进行数据传输 我已经断开了与旧连接的连接,并将其设置为空值,然后将串行连接设置为具有不同波特率的新连接 连接不稳定,我有时会遇到系统。ObjectDisposedException-我错过了什么 连接代码 public string startConnection() { if (serial != null) { serial.Dispose();

在我的应用程序中,我使用9600波特率串行连接,我想使用115200波特率连接进行数据传输

我已经断开了与旧连接的连接,并将其设置为空值,然后将串行连接设置为具有不同波特率的新连接

连接不稳定,我有时会遇到
系统。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);
        }

    }
private async void BurnOFP_click(对象发送方,RoutedEventArgs e)
{
startConnection();
一些行动。。。。。。。。。。。。。
断开连接();
var t=新任务(()=>
{
尝试
{
myUswm.startModelConnection();//相同但波特率不同
}
catch(异常e2){MessageBox.Show(e2.Message);}
});
t、 Start();
t、 等待();
modem=new XMODEM_FullDotNET(myUswm.getSerialPort(),XMODEM_FullDotNET.Variants.XModemCRC);
buff=File.ReadAllBytes(softwareFilePath\u Text.Text);
如果(buff.Length<1)
{
Show(“错误:错误的OFP文件”);
返回;
}
if(myUswm.prepareOFPBurning())//发送u以开始传输
{
如果(isBurning==false)
{
isBurning=true;
调制解调器。\u ProgressSent=0;
myProgBar=新的myProgressBar(调制解调器);
myProgBar.StartTransfer(调制解调器、增益长度);
myProgBar.Show();//显示窗口
//这里有例外!!!!!!!!!!
var t3=新任务(()=>
{
调制解调器发送(buff);
});
............
}
其他的
MessageBox.Show(“正在燃烧…”);
}
}
捕获(异常e1)
{
MessageBox.Show(e1.Message);
}
}

感谢您的帮助

已解决

我的问题是关闭和重新打开同一个端口造成的时间错误

我在MSDN序列类中找到了相关信息:

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


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

是否要同时以9600波特和115200波特与设备通信?您是否将设备UART更改为支持115200?“不稳定”是什么意思?你从哪里得到System.ObjectDisposedException?顺便说一句-如果您只是等待异步任务完成,为什么要对
myUswm.startModelConnection()
使用异步任务。我确实改变了UART支持。2.不稳定意味着有时我得到异常,有时没有。3.我在关闭串行连接后得到异常,并在同一端口上用新的串行连接重新打开它。4.这是连接方法的一个古老实现。在异步任务上再这样做也没有意义了。