使用serialport控件后如何关闭串口?

richer0412 2011-07-28 11:39:41
我作了一个程序不停的从串口读取数据。
但是在关闭窗体的时侯,发生了问题。
我用一个按钮关闭窗体就会发生程序停止响应的情况。应该怎么办呀?

ifread = false;

serialPort1.Close();
serialPort2.Close();
我在每个datareceived 事件里都加了一个bool量来控制是否读取串口数据。但是在关闭串口的时侯还是出问题。该怎么办呀?
...全文
1706 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
茄果 2012-03-06
  • 打赏
  • 举报
回复
可能是你读取数据那里有问题,如果是readtovalue,如果找不到value就一直读。所以关闭串口就出错了
lfqsy 2012-03-06
  • 打赏
  • 举报
回复
我觉得就算你不关串口直接关闭窗体,这个串口也应该会关闭的,看看别的原因
baiyun2013 2012-03-06
  • 打赏
  • 举报
回复
http://www.360doc.com/content/12/0217/10/6889381_187283539.shtml

看看这个有帮助
ziyouli 2012-01-11
  • 打赏
  • 举报
回复
在serialPort1.Close();之前加一句serialPort1.BreakState = true;强制中断信号试试。
火星大能猫 2011-12-14
  • 打赏
  • 举报
回复


/// <summary>
/// 打开串口,返回true则成功打开
/// </summary>
/// <returns></returns>
public bool Open()
{
if (comPort.IsOpen)
comPort.Close();
try
{
comPort.Open();
}
catch (Exception ex)
{
throw ex;
}
return comPort.IsOpen;
}

/// <summary>
/// 关闭串口,如果返回false,则已关闭
/// </summary>
/// <returns></returns>
public bool CloseComport()
{
try
{
if (comPort.IsOpen)
comPort.Close();
}
catch (Exception ex)
{
throw ex;
}
return comPort.IsOpen;
}


//打开串口事件
comPort = new SerialPort(cmbPort.Text, baudRate, tempParity, dataBits, StopBits.One);

comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
comPort.Encoding = myEncode;

if (this.Open())
{
SetTsslMsg("指定串口已打开!");
}
//关闭相关事件和方法
private void btnClose_Click(object sender, EventArgs e)
{
if (!this.CloseComport())
{
SetTsslMsg("串口关闭成功!");
button1.Enabled = true;
}
}

private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}

//comPort_DataReceived串口接收事件
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//读取串口中一个字节的数据
this.Invoke(
//在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
//即在textBox_ReceiveDate控件的父窗口form中执行委托.
new MethodInvoker(
/*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
delegate
{
/*匿名方法, */
//// txtMsg.AppendText(comPort.ReadBufferSize.ToString() + "\r\n");
List<byte> bytData = new List<byte>();
byte[] readBuffer = new byte[comPort.ReadBufferSize + 1];
int count = comPort.Read(readBuffer, 0, comPort.ReadBufferSize);
string msgRec = myEncode.GetString(readBuffer, 0, count);
BaseTools.WriteToLog("LIS端接收到信息:" + msgRec);
lovejun 2011-12-13
  • 打赏
  • 举报
回复
try
{
if (comPort.IsOpen)//端口的状态是打开
{

comPort.Close();//关闭端口
}
else
{
comPort.Open();
}


}

catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
richer0412 2011-07-29
  • 打赏
  • 举报
回复
别沉了,顶呀。
求助呀。哪位大哥能给好好说说
KEecho 2011-07-28
  • 打赏
  • 举报
回复

if (mycomm.IsOpen)
{
mycomm.Close();
Dispose();//清除资源
richTextBox1.Text += "断开端口成功\n";

// MessageBox.Show("断开端口成功");
}

个人愚见
最好做个监听 http://blog.csdn.net/wuyazhe/article/details/5606276
sdl2005lyx 2011-07-28
  • 打赏
  • 举报
回复
你在代码里加上,try{}catch{},看看程序报的什么异常。。。。
richer0412 2011-07-28
  • 打赏
  • 举报
回复
我按照2楼给的链接成下面这样,还是关闭不上串口呀?
public void read1(object sender, SerialDataReceivedEventArgs e)
{
if (ifread == false) return;
try
{
if (ifread)
{
listening = true;
int y = serialPort2.BytesToRead;
byte[] z = new byte[y];
serialPort2.Read(z, 0, y);
for (int i = 0; i < z.Length; i++)
{
zjresult1.Add(z[i]);
if (z[i] == 13 & zjresult1.IndexOf(sbz) + zjresult1.IndexOf(wbz) == 9)
{
byte[] aaa = new byte[2];

zjresult1.CopyTo(zjresult1.IndexOf(sbz) + 7, aaa, 0, 2);
string zt1 = Convert.ToString(aaa[0], 16);
string zt2 = Convert.ToString(aaa[1], 16);
string zt11 = zt1.Substring(0, 1);
string zt12 = zt1.Substring(1, 1);


zjresult1.CopyTo(zjresult1.IndexOf(sbz) + 1, encoding1, 0, 6);
result1 = inputstr.encoding1(encoding1);
if (zt2.Length == 2)
{
string zt22 = zt2.Substring(1, 1);
switch (zt22)
{
case "2":
result1 = result1.Substring(0, 5) + "." + result1.Substring(5, 1);
break;
case "3":
result1 = result1.Substring(0, 4) + "." + result1.Substring(4, 2);
break;
case "4":
result1 = result1.Substring(0, 3) + "." + result1.Substring(3, 3);
break;
case "5":
result1 = result1.Substring(0, 2) + "." + result1.Substring(2, 4);
break;
case "6":
result1 = result1.Substring(0, 1) + "." + result1.Substring(1, 5);
break;
case "7":
result1 = "." + result1;
break;
}
result1 = "-" + result1;
}
else
{
switch (zt2)
{
case "2":
result1 = result1.Substring(0, 5) + "." + result1.Substring(5, 1);
break;
case "3":
result1 = result1.Substring(0, 4) + "." + result1.Substring(4, 2);
break;
case "4":
result1 = result1.Substring(0, 3) + "." + result1.Substring(3, 3);
break;
case "5":
result1 = result1.Substring(0, 2) + "." + result1.Substring(2, 4);
break;
case "6":
result1 = result1.Substring(0, 1) + "." + result1.Substring(1, 5);
break;
case "7":
result1 = "0." + result1;
break;
}
}

cljg1 = Convert.ToDouble(result1);






myInvoke1 ma = new myInvoke1(updateform1);
this.Invoke(ma, new object[] { result1, zt11, zt12 });

result1 = string.Empty;
zjresult1.Clear();













}




}
}
}
finally
{ listening = false; }
}
richer0412 2011-07-28
  • 打赏
  • 举报
回复
我试了加try {} 和catch{};还有关闭后dispose();都没有反应。
我如果用一个按钮,先把ifread 这个控制datarecived事件里读取数据的的变量设成false 然后在formclosing 事件里关闭串口,就不会出现程序没有响应的情况了。各人反析就是我在执行关闭串口的时侯,一定有串口的线程在执行读取串口,所以就造成了不能关闭串口而我用一个按钮先把ifread设成false则即使触发了datarecived事件也不会读从串口读取数据了,这时侯我在用手点关闭窗体的时侯触发formclosing事件里执行serialport1.close();就不会出现程序停止响应的情况了(这里有一个时间差)。 但是我的问题是这样我就闭需先按一个按钮执行ifread=false;然后在执行关闭窗体和串口命令。
太麻烦了。我试了用
ifread = false ;
thread.sleep(1000);
serialport1.close();

来制造这个时间差,可试没有用。求达人帮助。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧