C# 将串行连接重置为不同波特率后出现异常
在我的应用程序中,我使用9600波特率串行连接,我想使用115200波特率连接进行数据传输 我已经断开了与旧连接的连接,并将其设置为空值,然后将串行连接设置为具有不同波特率的新连接 连接不稳定,我有时会遇到C# 将串行连接重置为不同波特率后出现异常,c#,serial-port,C#,Serial Port,在我的应用程序中,我使用9600波特率串行连接,我想使用115200波特率连接进行数据传输 我已经断开了与旧连接的连接,并将其设置为空值,然后将串行连接设置为具有不同波特率的新连接 连接不稳定,我有时会遇到系统。ObjectDisposedException-我错过了什么 连接代码 public string startConnection() { if (serial != null) { serial.Dispose();
系统。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.这是连接方法的一个古老实现。在异步任务上再这样做也没有意义了。