我作了一个程序不停的从串口读取数据。
但是在关闭窗体的时侯,发生了问题。
我用一个按钮关闭窗体就会发生程序停止响应的情况。应该怎么办呀? ifread = false;
serialPort1.Close();
serialPort2.Close();
我在每个datareceived 事件里都加了一个bool量来控制是否读取串口数据。但是在关闭串口的时侯还是出问题。该怎么办呀?
但是在关闭窗体的时侯,发生了问题。
我用一个按钮关闭窗体就会发生程序停止响应的情况。应该怎么办呀? ifread = false;
serialPort1.Close();
serialPort2.Close();
我在每个datareceived 事件里都加了一个bool量来控制是否读取串口数据。但是在关闭串口的时侯还是出问题。该怎么办呀?
解决方案 »
- 如何限制一个窗体程序的登陆次数
- C#用程序如何屏蔽360的主动防护,超难,网上都没有这方面的内容。
- 求一个例子
- c# socket.connect超时
- 请问如何在string中加分号
- 异步Socket通信时(Tcp/Ip协议),关于在客户端和服务器端自动显示对方发送数据的问题。
- 困扰三个多月来未解决问题求教.....
- 异常处理 init && load
- DataGrid 记录修改后如何上传到数据库中?!
- 急!急!急! 有那位大哥用过Splitter作资源管理器中关于TreeView和ListView的大小的改动.
- 外包 or 自行开发 ,公司该如何选择业务管理软件?
- winform中的listbox应用
if (mycomm.IsOpen)
{
mycomm.Close();
Dispose();//清除资源
richTextBox1.Text += "断开端口成功\n";
// MessageBox.Show("断开端口成功");
}个人愚见
最好做个监听 http://blog.csdn.net/wuyazhe/article/details/5606276
我如果用一个按钮,先把ifread 这个控制datarecived事件里读取数据的的变量设成false 然后在formclosing 事件里关闭串口,就不会出现程序没有响应的情况了。各人反析就是我在执行关闭串口的时侯,一定有串口的线程在执行读取串口,所以就造成了不能关闭串口而我用一个按钮先把ifread设成false则即使触发了datarecived事件也不会读从串口读取数据了,这时侯我在用手点关闭窗体的时侯触发formclosing事件里执行serialport1.close();就不会出现程序停止响应的情况了(这里有一个时间差)。 但是我的问题是这样我就闭需先按一个按钮执行ifread=false;然后在执行关闭窗体和串口命令。
太麻烦了。我试了用
ifread = false ;
thread.sleep(1000);
serialport1.close();来制造这个时间差,可试没有用。求达人帮助。
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; }
}
{
if (comPort.IsOpen)//端口的状态是打开
{ comPort.Close();//关闭端口
}
else
{
comPort.Open();
}
} catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
/// 打开串口,返回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);