当COM口相关的程序非法关闭或是COM口停止响应时,再次运行程序时会检测到端口是打开状态,你不能再重新打开,所以什么也执行不了了.这时你想关端口也不行.对端口的操作也执行不了.主要重起电脑后才可以恢复,问在VB里加入一段什么代码可以不重起电脑就恢复端口状态.

解决方案 »

  1.   

    1)将你的程序已源代码方式直接在开发环境下运行,看看能不能在出错的时候获得错误提示信息。
    2)或采用通信模块放独立窗体,通过全局变量传递数据,在主窗体使用TIMER控件定时UNLOAD通信窗体,然后即刻加载。
    程序可长时间运行不出错。 
    Private Sub Timer1_Timer()
        If lbltime.Caption <> CStr(Time) Then
            FrmRun.Caption = "运行图" & Space(100) & Date$ & Space(6) & Time$
            frmMain.Caption = "串口接收发送" & Space(60) & Date$ & Space(6) & Time$ '在内存中加载通信窗体
            miao = Right$(Time$, 2)
            fen = Right$(Left$(Time$, 5), 2)
            mmm = Val(fen * 60) + Val(miao) '每小时卸载加载frmMdb
            If miao = "15" Or miao = "45" Then
                Unload frmMain '卸载通信窗体
            End If
        End If
    End If
    3)串口通信受现场电磁干扰的错误,引起VB程序处于某种不确定的错误而无法捕获.代码就是针对此情况作
    出的处理.理由是WINDOWS系统当机而程序无法执行时,就是强行退出该线程.
    详细参阅:http://topic.csdn.net/u/20071220/21/2dd86b50-2f5d-47b0-b4a9-3b232b493396.html
      

  2.   

    没什么办法,com口是独占的
    程序出错后是不是没完全退出?如果已经完全退出了,还是占用COM口,那就没任何办法
      

  3.   

    试试在设备管理器中将COM1禁用后再启用。
      

  4.   

    试下下列强制退出(注销)代码是否能解决你的问题?
    Option Explicit
        Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long
        Private Const EWX_LogOff As Long = 0
        Private Declare Function GetLastError Lib "kernel32" () As LongPrivate Sub cmdLogoff_Click()
        ExitWindowsEx (EWX_LogOff), &HFFFF
        'MsgBox "ExitWindowsEx's GetLastError " & GetLastError
        End
    End Sub
      

  5.   

    凡是调用CreatFile,并且第一个参数是"COMn
    "的,在你的HOOK中都保存CreatFile返回的句柄,这样就可以把你的代码注入他的程序,关闭串口和文件操作一样CloseHandle就行.