串口通信捕获“连接到系统上的设备未发挥作用”异常

80donet 2014-01-24 03:53:20
if (Sp1.IsOpen)
{
Sp1_IsTryToClosePort = true;
while (Sp1_IsReceiving) Application.DoEvents();
Sp1.Close();
}
else
{
return;
}


if (Sp.IsOpen)
{
Sp_IsTryToClosePort = true;
while (Sp_IsReceiving) Application.DoEvents();
Sp.Close(); }
else
{
return;
}

this.Hide();
frmPrint frmDY = new frmPrint();
frmDY.Show();
以上这段代码放在定时器中关闭串口时会在Sp.Close(); 处卡死程序,放在button按钮中关闭就正常的,请各位高手不吝赐教!!!

private void timer2_Tick(object sender, EventArgs e)
{
if (Infoflag == 0)
{
#region
Byte[] YData = { 0x02, 0x30, 0x30, 0x45, 0x34, 0x30, 0x30, 0x31, 0x03, 0x36, 0x44 };
Sp1.Write(YData, 0, 11);
#endregion
}
if(Infoflag ==1)
{
#region
Byte[] XData = { 0x02, 0x30, 0x30, 0x30, 0x38, 0x30, 0x30, 0x32, 0x03, 0x35, 0x44 };
Sp1.Write(XData, 0, 11);
#endregion
}
if(Infoflag ==2)
{
#region
Byte[] YData = { 0x02, 0x30, 0x30, 0x30, 0x41, 0x30, 0x30, 0x31, 0x03, 0x36, 0x35 };
Sp1.Write(YData, 0, 11);
#endregion
}
if (Infoflag ==3)
{
#region
Byte[] MData = { 0x02, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x03, 0x35, 0x35 };
Sp1.Write(MData, 0, 11);
#endregion
}
if (Infoflag == 4)
{
#region
Byte[] YData = { 0x02, 0x37, 0x30, 0x35, 0x30, 0x35, 0x03, 0x30, 0x34 };
Sp1.Write(YData, 0, 9);
timer2.Enabled = false;
#endregion
}
if (Infoflag == 5)
{
#region
Byte[] MData = { 0x02, 0x37, 0x30, 0x34, 0x30, 0x38, 0x03, 0x30, 0x36 };
Sp1.Write(MData, 0, 9);
#endregion
}

}
在定时器中放了几条指令,50ms间隔一次,是一发一收的格式,偶尔还会出现“连接到系统上的设备未发挥作用”异常,就会卡在Sp1.Write(...)这边不知道是什么原因.
...全文
4304 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
80donet 2014-02-11
  • 打赏
  • 举报
回复
引用 10 楼 leafmao 的回复:
[quote=引用 8 楼 yanping1988 的回复:] [quote=引用 7 楼 leafmao 的回复:] 把代码贴上来看看,涉及公司关键部分不要贴,容易出问题的地方贴一下 贴下定时器里的代码和对接收数据进行处理的代码
if (Sp1.IsOpen) { Sp1_IsTryToClosePort = true; while (Sp1_IsReceiving) Application.DoEvents(); Sp1.Close(); } else { return; } if (Sp.IsOpen) { Sp_IsTryToClosePort = true; while (Sp_IsReceiving) Application.DoEvents(); Sp.Close(); } else { return; } this.Hide(); frmPrint frmDY = new frmPrint(); frmDY.Show(); 就这段代码啊,上面不是贴出来了,红色部分是传感器的串口在定时器中关闭会卡死。在公司这边测试一切正常,郁闷[/quote] 卡死的时候正好执行到Sp.Close(),虽然是这里出错,但也可能是跟别的地方发生冲突,比如发生死锁什么的。 Sp_IsReceiving这个标识符是在接收部分进行更改的吗,等到对接收到的数据全部处理完后再将这个标志置false么? 另外,定时器用 的是什么定时器,Form名称空间下的还是System.Timer名称空间下的[/quote]Sp_IsReceiving在接受解析完成后置false了,直接用的Timer控件
leafmao 2014-02-11
  • 打赏
  • 举报
回复
引用 8 楼 yanping1988 的回复:
[quote=引用 7 楼 leafmao 的回复:] 把代码贴上来看看,涉及公司关键部分不要贴,容易出问题的地方贴一下 贴下定时器里的代码和对接收数据进行处理的代码
if (Sp1.IsOpen) { Sp1_IsTryToClosePort = true; while (Sp1_IsReceiving) Application.DoEvents(); Sp1.Close(); } else { return; } if (Sp.IsOpen) { Sp_IsTryToClosePort = true; while (Sp_IsReceiving) Application.DoEvents(); Sp.Close(); } else { return; } this.Hide(); frmPrint frmDY = new frmPrint(); frmDY.Show(); 就这段代码啊,上面不是贴出来了,红色部分是传感器的串口在定时器中关闭会卡死。在公司这边测试一切正常,郁闷[/quote] 卡死的时候正好执行到Sp.Close(),虽然是这里出错,但也可能是跟别的地方发生冲突,比如发生死锁什么的。 Sp_IsReceiving这个标识符是在接收部分进行更改的吗,等到对接收到的数据全部处理完后再将这个标志置false么? 另外,定时器用 的是什么定时器,Form名称空间下的还是System.Timer名称空间下的
fansf2008 2014-02-10
  • 打赏
  • 举报
回复
定时器应该不能去关闭串口,因为定时器相当于一个特殊的线程,它不能去关闭主程序里面打开的设配。如果需要关闭串口的话,在form_load中区关闭应该不会出现这个问题的。
80donet 2014-02-10
  • 打赏
  • 举报
回复 1
引用 7 楼 leafmao 的回复:
把代码贴上来看看,涉及公司关键部分不要贴,容易出问题的地方贴一下 贴下定时器里的代码和对接收数据进行处理的代码
if (Sp1.IsOpen) { Sp1_IsTryToClosePort = true; while (Sp1_IsReceiving) Application.DoEvents(); Sp1.Close(); } else { return; } if (Sp.IsOpen) { Sp_IsTryToClosePort = true; while (Sp_IsReceiving) Application.DoEvents(); Sp.Close(); } else { return; } this.Hide(); frmPrint frmDY = new frmPrint(); frmDY.Show(); 就这段代码啊,上面不是贴出来了,红色部分是传感器的串口在定时器中关闭会卡死。在公司这边测试一切正常,郁闷
leafmao 2014-02-09
  • 打赏
  • 举报
回复
把代码贴上来看看,涉及公司关键部分不要贴,容易出问题的地方贴一下 贴下定时器里的代码和对接收数据进行处理的代码
80donet 2014-02-09
  • 打赏
  • 举报
回复
引用 5 楼 leafmao 的回复:
[quote=引用 2 楼 yanping1988 的回复:] [quote=引用 1 楼 leafmao 的回复:] 查看下引起的具体异常是什么,Exception的类型,然后对照着看看是哪里出问题
那个“连接到系统上的设备未发挥作用”异常解决了,之前笔记本用的是232转USB的,换成485转USB的即可,那个端口关闭的卡死,我在公司这边的模拟环境下与PLC通信没出新过,但到了客户那边就出现,高手在哪里?不吝赐教啊 ![/quote] 既然只在定时器里才出现这个问题,看看是不是多线程的问题[/quote] 请详细点说说您的高见相同的程序在公司测试是正常的,但到了客户现场就会卡死在关闭传感器串口那,不知道神马情况?唯一的区别就是在现场时传感器是和设备绑在一起的,在公司是手摇晃的。
leafmao 2014-02-08
  • 打赏
  • 举报
回复
引用 2 楼 yanping1988 的回复:
[quote=引用 1 楼 leafmao 的回复:] 查看下引起的具体异常是什么,Exception的类型,然后对照着看看是哪里出问题
那个“连接到系统上的设备未发挥作用”异常解决了,之前笔记本用的是232转USB的,换成485转USB的即可,那个端口关闭的卡死,我在公司这边的模拟环境下与PLC通信没出新过,但到了客户那边就出现,高手在哪里?不吝赐教啊 ![/quote] 既然只在定时器里才出现这个问题,看看是不是多线程的问题
80donet 2014-01-26
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
while (Sp_IsReceiving) Application.DoEvents();死循环不卡死才怪。
不是死循环啊,我操作完PLC和传感器后都把Sp_IsReceiving置成false了,我看了运行不是这边,就是Sp.Close();这句运行到就卡死啊!
本拉灯 2014-01-26
  • 打赏
  • 举报
回复
while (Sp_IsReceiving) Application.DoEvents();死循环不卡死才怪。
80donet 2014-01-26
  • 打赏
  • 举报
回复
引用 1 楼 leafmao 的回复:
查看下引起的具体异常是什么,Exception的类型,然后对照着看看是哪里出问题
那个“连接到系统上的设备未发挥作用”异常解决了,之前笔记本用的是232转USB的,换成485转USB的即可,那个端口关闭的卡死,我在公司这边的模拟环境下与PLC通信没出新过,但到了客户那边就出现,高手在哪里?不吝赐教啊 !
leafmao 2014-01-24
  • 打赏
  • 举报
回复
查看下引起的具体异常是什么,Exception的类型,然后对照着看看是哪里出问题

111,094

社区成员

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

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

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