串口类 SerialPort 断开后重新打开的问题?

wopos 2007-12-06 10:40:52
大家好:
我利用 .Net2.0中的 SerialPort类来访问串口,我要求串口连接如果中途断开了,需要自动重新连接,我写了如下代码:

Private WithEvents COMPort As New SerialPort
Private Timer1 As System.Timers.Timer '声明两个变量

Private Sub FrmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
COMPort.PortName = "COM3"
COMPort.BaudRate = 57600
COMPort.Parity = Parity.None
COMPort.DataBits = 8
COMPort.StopBits = StopBits.One
COMPort.Handshake = Handshake.None
COMPort.ReadTimeout = 100
COMPort.Open() '打开串口 ,然后接收数据等工作正常。

Timer1 = New Timer
Timer1.Interval = 2000
AddHandler Timer1.Elapsed, AddressOf Timer1_Tick
Timer1.Start '开启时钟
End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
If COMPort.IsOpen = False Then '如果发现 IsOpen=False 即连接已经断开,例如把串口线拔掉。
COMPort.Close
Threading.Thread.Sleep(1000) ' 此时串口线已经重新连接上。
dim portNames() as string =SerialPort.GetPortNames
dim ComName as string =portNames(0) ' ComName="COM3" 能发现串口 COM3
COMPort.PortName = ComName
COMPort.Open '尝重连时总是提示“The Port "COM3" does not exist"
End If
End Sub

如果中途把串口拔掉,程序中有一个时钟一直在监视连接情况的,这时会检测到串口 已经断了,然后多次尝试再次连接,如果这时再把串口线接上,就应该会自动再打开串口。现在的问题是当线接上,尝试再打开时总是提示串口不存在。


VB.net代码,很简单,因为C#人气足,高手多,所以发这里了,请见谅。
求一个解决方案,谢谢。

...全文
3599 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellofurixiang 2011-07-07
  • 打赏
  • 举报
回复
请高手指教
hellofurixiang 2011-07-07
  • 打赏
  • 举报
回复
初来乍到,结果遇到同样的问题,Open()的时候就卡了,停止调试就提示分离线程未结束之类的
jinghualing 2011-06-24
  • 打赏
  • 举报
回复
遇到了同样问题,一直没有解决~~郁闷
shengtaishengtai 2010-06-08
  • 打赏
  • 举报
回复
可以在设备管理器当中看端口,只有当serialport.close()之后,哪个端口才被释放!
shengtaishengtai 2010-06-08
  • 打赏
  • 举报
回复
我也遇到了同样的问题,我用的是serialport1控件
wopos 2008-01-18
  • 打赏
  • 举报
回复
longlijun :
经调试,把线拨掉后,检测到 IsOpen=False了,
现在的问题并不是要检测到线什么时候拨掉,而是无论关闭串口后,IsOpen=False了,再尝试打开时提示端口不存在。
我再多尝试几次,谢谢以上各位。
富莱工作室 2007-12-29
  • 打赏
  • 举报
回复
如果, 你期望你的程序在通信中实时检查通信连接线是否被拔走,
你必须自定协议, 所谓的心跳包, 是个好办法, 比如下层设备每隔1秒给你一个存在信号,
那么超过1秒, 上层程序没有发现该信号, 是为连接已断开, 关闭串口,重新连接
富莱工作室 2007-12-29
  • 打赏
  • 举报
回复
"我利用 .Net2.0中的 SerialPort类来访问串口,我要求串口连接如果中途断开了,需要自动重新连接"
If COMPort.IsOpen = False Then '如果发现 IsOpen=False 即连接已经断开,例如把串口线拔掉。

以上可以看出, 你对SERIALPORT极不熟悉
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
里面全为无用代码


COMPort.IsOpen 表示串口是否处于打开状态, IsOpen=False,表示串口处于关闭状态,
正在通信的串口, 如果你把串口线拔掉, 并不会引起串口关闭, ComPort.IsOpen仍然等于True,
所以,你检测代码在做无用功
Lvgdq 2007-12-29
  • 打赏
  • 举报
回复
谢谢5楼的..我的已经调好了,就是忘记了Close()操作。
Efcndi 2007-12-29
  • 打赏
  • 举报
回复
在打开串口前未能关闭串口

try:

if( COMPort.IsOpen == true )
{
COMPort.Close();
}
Efcndi 2007-12-29
  • 打赏
  • 举报
回复
if( COMPort.IsOpen = true )
{
COMPort.Close();
}

这个IsOpen属性不是对应着你串口线是否连上,
而是对应着你是否执行了Open()操作。
Lvgdq 2007-12-28
  • 打赏
  • 举报
回复
但是我也遇到这个问题啊。用的C#VS2005SerialPort类,可是也象LZ一样的。即使我使用了
if (js.IsOpen == false)
{
js.Open();
}
作判断,但是程度第二次打开串口时依然提示串口不存在。等待高手指导....
fly_to_sky 2007-12-28
  • 打赏
  • 举报
回复
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
If COMPort.IsOpen = False Then '如果发现 IsOpen=False 即连接已经断开,例如把串口线拔掉。
COMPort.Close
Threading.Thread.Sleep(1000) ' 此时串口线已经重新连接上。
COMPort.PortName = "COM1" '你不要用虚拟的,确定COM1存在
COMPort.Open '尝重连时总是提示“The Port "COM3" does not exist"
End If
End Sub



'你这个样子试试 我是用c#没见到这样的问题
wopos 2007-12-07
  • 打赏
  • 举报
回复
up,thanks
龙宜坡 2007-12-06
  • 打赏
  • 举报
回复
见到过类似问题,SF先!
帮你找找!

110,534

社区成员

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

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

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