2012-11-06 363 views
1

美好的一天如何解決VB6中的運行時錯誤8015?

我試圖發送數據到comport「COM1」。通用打印機驅動程序在comport「COM1」上設置。在向此端口發送數據時,我收到運行時錯誤「8015:無法設置通信狀態,可能有一個或多個無效通信參數」。點擊確定後,出現錯誤消息,我得到另一個錯誤,運行時錯誤'8018:操作僅在端口打開時有效'。我相信這個問題可以解決,因爲在命令提示符中,我可以使用命令「copy C:\ textfile.txt COM1」將文本文件複製到端口,並且它沒有任何問題。那是我的情況。

我已經試過的方法如下:

  • 使用MSComm控件(產生上述錯誤)
  • 採用windows API調用(這給了不同的錯誤「無效函數」) API鏈接:http://www.thescarms.com/vbasic/CommIO.aspx
  • 使用shell功能殼CMD.EXE與「複製」命令(這種方法可行 當它要)
  • 使用VB6e FileCopy()函數時不copyi工作ng到端口

我相信能回答這個問題的人是深入瞭解COM端口通信信息的人,並深入瞭解Windows複製命令的相關信息。

我在某個論壇上看過(我經歷過太多次了),如果你刪除插件並插回去,它就可以解決這個問題。我還沒有嘗試過,但我已嘗試關閉設備並將其放回,我相信這是相同的事情。

如果任何人都可以用這個問題將是非常讚賞

幫助這裏也許是一個很有趣的鏈接:

感謝,

約爾

按照Beaner的要求:

這是我正在使用的代碼片段。

MSComm1.PortOpen = True 

執行:

Private Sub Initialize_COMPort() 

On Error GoTo COMPort_Error 

    If MSComm1.PortOpen Then 
     MsgBox "Port is opened" 
     MSComm1.PortOpen = False 
    End If 

    MSComm1.Settings = "9600,n,8,1" 
    MSComm1.CommPort = Val(CbCOMPorts.ListIndex) + 1 
    MSComm1.PortOpen = True 
    MSComm1.RThreshold = 1 
    MSComm1.Handshaking = comXOnXoff 

    Exit Sub 

COMPort_Error: 
    MsgBox Err.Number & " - " & Err.Description, vbCritical + vbOKOnly, "Port Tester", Err.HelpFile, Err.HelpContext 
End Sub 

該錯誤時,會發生。

@Hrqls我很欣賞代碼,但是您給我的代碼與頭腦類似,執行時錯誤仍然存​​在。在同一份聲明

.PortOpen = True 

@Hrqls我還沒有嘗試使用打印機控制之前但是這個裝置實際上不是一個文本打印機是一個卡壓花出現的錯誤。它的「Matica Z3i AF」embosser我目前正在使用的程序將用於浮雕卡片。

當前使用的方法是使用embosser是一個批處理文件,該文件基本上運行文本文件的「複製」命令,其中卡信息以embosser所能理解的格式打印。

我會嘗試使用打印機控件,直到那時感謝您的回覆,並且如果問題得到解決,我會讓所有人保持最新狀態。

+0

您可以發佈相關的代碼輸出? – jac

+0

@Beaner我編輯了原始文章的代碼 – user1803784

回答

2

我承擔錯誤來自一個事實,即COM1已在使用打印機,在這種情況下,你的MSCOMM控制不能使用COM1以及

你想打印什麼?

的最簡單,最直接的打印的東西是使用打印機對象

例如,要打印出當前時間:

Private Sub Command1_Click() 
    Printer.Print CStr(Now) 
    Printer.EndDoc 
End Sub 
+0

謝謝@Hrqls。我嘗試過打印機對象,它將數據發送到端口,但是它以多個句點字符發送。即「測試」發送爲「.TEST ........... ............................ ...........................「。我使用這個(http://www.eterlogic.com/Products.VSPE.html)程序來攔截髮送的消息。 – user1803784

+0

您給我的鏈接使用「打開端口:設置輸出爲#N」解決了問題。謝謝...謝謝...非常感謝您。 – user1803784

0

檢查,如果一個端口已在使用,你可以打開它和跟蹤錯誤代碼

一個小項目,列出一個列表框可用端口:

'1 form with : 
' 1 CommandButton : Name = Command1 
' 1 Listbox  : Name = List1 
' 1 MSComm  : Name = MSComm1 
Option Explicit 

Private Enum PortAttr 
    PortFree = 0 
    PortInUse = 1 
    PortUnknown = 2 
End Enum 

Private Function CheckPort(intPort As Integer) As PortAttr 
    On Error GoTo ErrorFound 
    With MSComm1 
    If .PortOpen Then .PortOpen = False 
    .CommPort = intPort 
    .PortOpen = True 
    CheckPort = PortFree 
    If .PortOpen = False Then .PortOpen = True 
    End With 'MSComm1 
Exit Function 
ErrorFound: 
    Select Case Err.Number 
    Case 8002 'port doesnt exist 
     CheckPort = PortUnknown 
    Case 8005 'port already in use 
     CheckPort = PortInUse 
    Case Else 
     MsgBox Err.Description, vbCritical, "Error " & CStr(Err.Number) & " on Port " & CStr(intPort) 
    End Select 
    On Error GoTo 0 
End Function 

Private Sub ListPorts() 
    Dim intIndex As Integer 
    Dim intPort As Integer 
    Dim intFree As Integer 
    On Error GoTo ErrorFound 
    With MSComm1 
    If .PortOpen Then .PortOpen = False 
    intPort = .CommPort 
    List1.Clear 
    List1.AddItem "--- Not Used ---" 
    List1.ItemData(0) = -2 'not possible 
    List1.AddItem "---- In Use ----" 
    List1.ItemData(1) = -2 'not possible 
    intFree = 0 
    For intIndex = 1 To 16 
     Select Case CheckPort(intIndex) 
     Case PortFree 
      intFree = intFree + 1 
      List1.AddItem "Com" & CStr(intIndex), intFree 
      List1.ItemData(intFree) = intIndex 
     Case PortInUse 
      List1.AddItem "Com" & CStr(intIndex) 
     End Select 
    Next intIndex 
    If .PortOpen Then .PortOpen = False 
    .CommPort = intPort 
    If CheckPort(intPort) = PortFree Then 
     If .PortOpen = False Then .PortOpen = True 
    End If 
    End With 'MSComm1 
    Show 
Exit Sub 
ErrorFound: 
    MsgBox Err.Description, vbCritical, "Error " & CStr(Err.Number) 
    On Error GoTo 0 
End Sub 

Private Sub Command1_Click() 
    ListPorts 
End Sub 
+0

我已經嘗試了上面的代碼併發生了相同的錯誤,我將嘗試使用打印機控制方法並告訴您結果。我編輯了我的原始帖子,詳細瞭解了 – user1803784

+0

的其他情況,看看下面的主題: https://groups.google.com/forum/?hl=zh-CN&fromgroups#!topic/microsoft .public.vb.general.discussion/5BiAjtxHF -w – Hrqls

1

您正在使用的計算機是否安裝了Matica Z3i AF,並且已經使用COM1的打印機?如果是這樣,端口正在使用中,並且MSComm控件無法訪問它。確保沒有其他已經打開端口的硬件或軟件。

如果沒有別的東西在使用端口,批處理文件是否會專門設置速度,奇偶校驗或停止位? (MODE COM1:9600,N,8,1,P)如果是這樣,您可以嘗試使用批處理文件中的設置。

如果這些都沒有幫助,我找不到您的壓紋機的建議設置,所以你可以嘗試基本的端口設置。您可以使用MODE COM1/STATUS查詢端口。該命令不區分大小寫,並返回如下內容:

 
Status for device COM1: 
----------------------- 
    Baud:   1200 
    Parity:   None 
    Data Bits:  7 
    Stop Bits:  1 
    Timeout:   OFF 
    XON/XOFF:  OFF 
    CTS handshaking: OFF 
    DSR handshaking: OFF 
    DSR sensitivity: OFF 
    DTR circuit:  ON 
    RTS circuit:  ON 
+0

非常感謝info @Beaner。我想我要告訴你的將會有很大的幫助。壓紋機使用Windows'「通用/純文本」驅動程序安裝。因此港口正在使用,我相信這是造成這個問題的主要原因。我試圖不使用驅動程序,這會導致壓紋機無法正常工作。由於當前正在使用「複製」命令以及壓紋機正常工作,我相信我們仍然可以將文本發送到端口。我相信我會以「複製」命令的方式將文本發送給壓紋機。 – user1803784

1

不要將打印機設置在端口COM1上。在COM1端口中,COM1端口將被打印機佔用。 使用Visual Basic MSCOMM組件時,不需要任何打印機驅動程序。 如果您在COM1端口中設置打印機。 您可以使用下面的代碼。此代碼不會受到打印機設置的影響。

的Visual Basic: 打開 「COM1」 對於AS#1

相關問題