1

再会

我正在尝试将数据发送到一个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 进行 shell(此方法在需要时有效)
  • 使用复制到端口时不起作用的 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”压花机,我目前正在开发的程序将用于对卡片进行压花。

当前采用的方法是使用压花机是一个批处理文件,它基本上运行带有卡片信息的文本文件的“复制”命令,以压花机可以理解的格式打印。

在此之前,我将尝试使用打印机控件,感谢您的回复,如果问题得到解决,我会及时通知大家。

4

4 回答 4

2

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

你想打印什么?

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

例如打印当前时间:

Private Sub Command1_Click()
  Printer.Print CStr(Now)
  Printer.EndDoc
End Sub
于 2012-11-07T07:58:53.787 回答
1

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

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

如果这些都没有帮助,我找不到您的压花机的建议设置,因此您可以尝试基本的端口设置。您可以使用MODE COM1 /STATUS查询端口。该命令不区分大小写,将返回如下内容:

设备 COM1 的状态:
----------------------
    波特率:1200
    奇偶校验:无
    数据位:7
    停止位:1
    超时:关闭
    XON/XOFF:关
    CTS 握手:关闭
    DSR 握手:关闭
    DSR 灵敏度:关
    DTR电路:开
    RTS电路:开
于 2012-11-07T23:46:07.577 回答
1

不要在端口 COM1 上设置打印机。COM1 端口将被 COM1 端口中的打印机占用。使用 Visual Basic MSCOMM 组件时,不需要任何打印机驱动程序。如果您确实在 COM1 端口中设置了打印机。您可以使用以下代码。此代码不受打印机设置的影响。

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

于 2013-02-21T07:29:19.357 回答
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
于 2012-11-07T08:14:40.600 回答