如何解决VB6中的运行时错误8015?

如何解决VB6中的运行时错误8015?,vb6,Vb6,你好 我正试图将数据发送到COM1。在comport“COM1”上设置了通用打印机驱动程序。将数据发送到此端口时,我收到运行时错误“8015:无法设置通信状态,可能有一个或多个无效通信参数”。单击该错误消息的“确定”后,我收到另一个错误,即运行时错误“8018:操作仅在端口打开时有效”。我相信这个问题是可以解决的,因为在命令提示符下,我可以使用“copy C:\textfile.txt COM1”命令将文本文件复制到端口,并且它可以正常工作。这就是我的处境 我尝试过的方法如下: 使用MSCom

你好

我正试图将数据发送到COM1。在comport“COM1”上设置了通用打印机驱动程序。将数据发送到此端口时,我收到运行时错误“8015:无法设置通信状态,可能有一个或多个无效通信参数”。单击该错误消息的“确定”后,我收到另一个错误,即运行时错误“8018:操作仅在端口打开时有效”。我相信这个问题是可以解决的,因为在命令提示符下,我可以使用“copy C:\textfile.txt COM1”命令将文本文件复制到端口,并且它可以正常工作。这就是我的处境

我尝试过的方法如下:

  • 使用MSComm控件(产生上述错误)
  • 使用windows API调用(这会产生另一个错误“无效函数”) API链接:
  • 通过“复制”命令将shell函数用于shell cmd.exe(此方法有效 当它想要的时候)
  • 使用在复制到端口时不起作用的VB6e FileCopy()函数
我相信,能够回答这个问题的人是了解有关COM端口通信的深入信息和有关windows copy命令的深入信息的人

我在某个论坛上读到(我已经经历了太多)如果你拔下插头并插回它,它就解决了这个问题。我还没有试过,但我已经试过关掉设备,然后把它放在后面,我相信这是一样的

如果有人能在这个问题上提供帮助,我们将不胜感激

下面是一个可能很有趣的链接:

谢谢

约根

根据Beaner的要求:

下面是我正在使用的代码片段

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
以下情况下会发生错误:

MSComm1.PortOpen = True
被执行

@Hrqls我很欣赏你的代码,但是你给我的代码和我的想法很相似,执行时错误仍然存在。错误发生在同一语句中

.PortOpen = True
@Hrqls我以前没有尝试过使用打印机控件,但是这个设备实际上不是文本打印机,而是卡片压花机。这是“Matica Z3i AF”压花机,我目前正在开发的程序将用于压花卡片

目前采用的方法是使用Empressure是一个批处理文件,它基本上运行文本文件的“复制”命令,并以Empressure理解的格式将卡信息打印到打印中


在此之前,我将尝试使用打印机控件。感谢您的回复,如果问题得到解决,我将让每个人都了解最新情况。

我假设错误来自打印机已在使用COM1,在这种情况下,您的MSCOMM控件也不能使用COM1

你想打印什么

打印内容最简单、最直接的方法是使用Printer对象

例如,要打印当前时间:

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

我假设错误来自打印机已经在使用COM1,在这种情况下,MSCOMM控件也不能使用COM1

你想打印什么

打印内容最简单、最直接的方法是使用Printer对象

例如,要打印当前时间:

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

要检查端口是否已在使用中,您可以打开它并跟踪错误代码

在列表框中列出可用端口的小项目:

'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

要检查端口是否已在使用中,您可以打开它并跟踪错误代码

在列表框中列出可用端口的小项目:

'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

您正在使用的计算机是否已安装Matica Z3i AF,打印机是否已使用COM1?如果是,则端口正在使用,MSComm控件无法访问它。确保没有其他硬件或软件已打开端口

如果端口没有其他用途,批处理文件是否专门设置速度、奇偶校验或停止位?(模式COM1:9600,N,8,1,P)如果是这样,您可以尝试使用批处理文件中的设置

如果这些都没有帮助,我找不到你的浮雕的建议设置,所以你可以尝试基本端口设置。您可以使用模式COM1/状态查询端口。该命令不区分大小写,将返回如下内容:

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 设备COM1的状态: ----------------------- 波特:1200 平价:无 数据位:7 停止位:1 超时:关闭 XON/XOFF:关 CTS握手:关闭 DSR握手:关闭 DSR灵敏度:关闭 DTR电路:ON RTS电路:打开
您正在使用的计算机是否已安装Matica Z3i AF,打印机是否已使用COM1?如果是,则端口正在使用,MSComm控件无法访问它。确保没有其他硬件或软件已打开端口

如果端口没有其他用途,批处理文件是否专门设置速度、奇偶校验或停止位?(模式COM1:9600,N,8,1,P)如果是这样,您可以尝试使用批处理文件中的设置

如果这些都没有帮助,我找不到你的浮雕的建议设置,所以你可以尝试基本端口设置。您可以使用模式COM1/状态查询端口。该命令不区分大小写,将返回如下内容:

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 设备COM1的状态: ----------------------- 波特:1200 平价:无 数据位:7 停止位:1 超时:关闭 XON/XOFF:关 CTS握手:关闭 DSR握手:关闭 DSR灵敏度:关闭 DTR电路:ON RTS电路:打开
不要将打印机设置在端口COM1上。 COM1端口将被COM1端口中的打印机占用。 使用Visual Basic MSCOMM组件时,不需要任何打印机驱动程序。 如果您将打印机设置为COM1端口。 您可以使用以下代码。此代码不受打印机设置的影响

Visual Basic:
打开“COM1”输出为#1

不要在端口COM1上设置打印机。 COM1 por