1

良い一日

私はcomport "COM1"にデータを送信しようとしています。汎用プリンタ ドライバは、comport "COM1" にセットアップされます。このポートにデータを送信すると、実行時エラー「8015: 通信状態を設定できませんでした。1 つ以上の無効な通信パラメータが存在する可能性があります」が表示されます。そのエラー メッセージに対して [OK] をクリックすると、実行時エラー「8018: ポートが開いている場合にのみ有効な操作」という別のエラーが表示されます。コマンドプロンプトで「copy C:\textfile.txt COM1」コマンドを使用してテキストファイルをポートにコピーでき、問題なく動作するため、この問題は解決できると思います。それが私の状況です。

私が試した方法は次のとおりです。

  • MSComm コントロールを使用する (上記のエラーが発生する)
  • Windows API 呼び出しを使用する (別のエラー「無効な関数」が発生する) API リンク: http://www.thescarms.com/vbasic/CommIO.aspx
  • shell 関数を使用して、「copy」コマンドで cmd.exe をシェルします (この方法は必要なときに機能します)。
  • ポートにコピーするときに動作しない VB6e FileCopy() 関数を使用する

この質問に答えることができる人は、COM ポート通信に関する詳細な情報を知っている人であり、Windows のコピー コマンドに関する詳細な情報を知っている人だと思います。

私はいくつかのフォーラムを読みました(私はあまりにも多くのことを経験しました)。プラグを取り外してプラグを差し込むと、この問題は解決します。私はまだそれを試していませんが、デバイスの電源を切って、元に戻そうとしましたが、同じことだと思います.

誰かがこの問題を助けることができれば、それは非常に高く評価されます

興味深いかもしれないリンクは次のとおりです。

ありがとう、

ヨルゲン

ビーナーの要求に応じて:

これが私が使用しているコードのスニペットです。

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回路:ON
    RTS回路:ON
于 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 に答える