Zugriff auf serielle und parallele Ports mithilfe von Visual Basic .NET

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 823179 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Eine Version dieses Artikels für Microsoft Visual Studio 2005 finden Sie unter 904795.
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt Schritt für Schritt, wie Sie mithilfe von Microsoft Visual Basic .NET auf serielle und parallele Ports zugreifen können. Außerdem enthält dieser Artikel Beispielcode zur Veranschaulichung der in diesem Artikel erläuterten Konzepte.

Voraussetzungen

Die folgende Liste führt die empfohlene Hardware, Software und Netzwerkinfrastruktur sowie die benötigten Service Packs auf:
  • Microsoft Windows Server 2003, Microsoft Windows XP oder Microsoft Windows 2000
  • Visual Basic .NET
In diesem Artikel wird vorausgesetzt, dass Sie über Erfahrungen in den folgenden Bereichen verfügen:
  • Programmieren in Visual Basic .NET
  • Plattformaufruf-Dienste in Visual Basic .NET

Verwenden des MSComm-Steuerelements in Visual Basic .NET zum Zugriff auf serielle Ports

Da es keine Microsoft .NET Framework-Klassen gibt, mit denen Sie auf an Ihren Computer angeschlossene Kommunikationsressourcen zugreifen können, können Sie dazu das Steuerelement MSComm in Microsoft Visual Basic 6.0 verwenden. Das Steuerelement MSComm stellt serielle Kommunikationsverbindungen für Ihre Anwendung bereit, indem es die Übertragung und den Empfang von Daten über einen seriellen Port ermöglicht. Gehen Sie folgendermaßen vor, um eine einfache serielle Kommunikationsverbindung über ein Modem zu implementieren:
  1. Starten Sie Microsoft Visual Studio .NET.
  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie auf Projekt.
  3. Klicken Sie unter Projekttypen auf Visual Basic-Projekte.
  4. Klicken Sie unter Vorlagen auf Konsolenanwendung.
  5. Geben Sie in das Feld Name den Begriff MyConsoleApplication ein, und klicken Sie auf OK.

    Standardmäßig wird "Module1.vb" erstellt.
  6. Klicken Sie mit der rechten Maustaste auf das Projekt MyConsoleApplication, und klicken Sie auf Verweis hinzufügen.
  7. Klicken Sie auf die Registerkarte COM, klicken Sie unter Komponentenname auf Microsoft Kommunikations-Steuerelement 6.0, klicken Sie auf Auswählen und anschließend auf OK.

    Hinweis Um dasMSComm-Steuerelement verwenden zu können, müssen Sie die zugehörigen COM-Komponenten von Microsoft Visual Basic 6.0 auf demselben Computer installieren, auf dem Microsoft Visual Studio .NET installiert ist.

    Weitere Informationen zu Lizenzproblemen, die beim Verwenden von Visual Basic 6.0-Steuerelementen in Visual Studio .NET auftreten können, finden Sie in folgendem Artikel der Microsoft Knowledge Base:
    318597 Fehlermeldungen, die bei Verwendung von Visual Basic 6.0-Steuerelementen in Visual Studio .NET auftreten können
  8. Ersetzen Sie den Code in "Module1.vb" durch den folgenden Beispielcode:
    Imports MSCommLib
    
    Module Module1
    
        Sub Main()
            'New a MSComm control
            Dim MSComm1 As MSComm
            MSComm1 = New MSComm
            ' Buffer to hold input string.
            Dim Buffer As String
            ' Use the COM1 serial port.
            MSComm1.CommPort = 1
            ' 9600 baud, no parity, 8 data, and 1 stop bit.
            MSComm1.Settings = "9600,N,8,1"
            ' Tell the control to read the whole buffer when Input is used.
            MSComm1.InputLen = 0
            ' Open the serial port.
            MSComm1.PortOpen = True
            Console.WriteLine("Open the serial port.")
            ' Tell the control to make the Input property return text data.
            MSComm1.InputMode() = InputModeConstants.comInputModeText
            'Clear the receive buffer.
            MSComm1.InBufferCount() = 0
            ' Send the attention command to the modem.
            MSComm1.Output = "ATV1Q0" & Chr(13)
            Console.WriteLine("Send the attention command to the modem.")
            Console.WriteLine("Wait for the data to come back to the serial port...")
            ' Make sure that the modem responds with "OK".
            ' Wait for the data to come back to the serial port.
            Do
                Buffer = Buffer & MSComm1.Input
            Loop Until InStr(Buffer, "OK" & vbCrLf)
            ' Read the "OK" response data in the serial port.
            ' Close the serial port.
            Console.WriteLine("Read the OK response data in the serial port.")
            MSComm1.PortOpen = False
            Console.WriteLine("Close the serial port.")
        End Sub
    
    End Module
  9. Drücken Sie die Tastenkombination [STRG]+[F5], um das Projekt zu erstellen und auszuführen. Es werden folgende Meldungen ausgegeben:
    Seriellen Port öffnen. (Open the serial port.)
    Send the attention command to the modem. (AT-Befehl an das Modem senden.)
    Wait for data to come back to the serial port... (Auf Datenrückgabe zum seriellen Port warten...)
    Read the OK response data in the serial port. (OK-Antwortdaten im seriellen Port lesen.)
    Close the serial port. (Seriellen Port schließen.)

Verwenden von Plattformaufruf-Diensten zum Aufrufen von Win32 API-Funktionen in Visual Basic .NET, um auf serielle und parallele Ports zuzugreifen

Gehen Sie hierzu wie folgt vor:
  1. Starten Sie Microsoft Visual Studio .NET.
  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie auf Projekt.
  3. Klicken Sie unter Projekttypen auf Visual Basic-Projekte.
  4. Klicken Sie unter Vorlagen auf Konsolenanwendung.
  5. Geben Sie in das Feld Name den Begriff MyConsoleApplication ein, und klicken Sie auf OK.

    Standardmäßig wird "Module1.vb" erstellt.
  6. Fügen Sie in "Module1.vb" den folgenden Code vor der Anweisung Module Module1 ein:
    Option Strict On
    
    ' Define a CommException class that inherits from the ApplicationException class, 
    ' and then throw an object of type CommException when you receive an error message.
    Class CommException
       Inherits ApplicationException
       Sub New(ByVal Reason As String)
          MyBase.New(Reason)
       End Sub
    End Class
  7. Deklarieren Sie Strukturen, Konstanten und Verweise auf externe Funktionen, die sich in "Kernel32.dll" befinden.

    Um nicht verwaltete Funktionen von Ihrer verwalteten Visual Basic .NET-Anwendung aus aufrufen zu können, müssen Sie Verweise auf Strukturen und die Konstanten deklarieren, die Sie als Parameter an die nicht verwalteten Funktionen übergeben. Fügen Sie hierzu in "Module1.vb" den folgenden Code nach der Anweisung Module Module1 ein:
    'Declare structures.
       Public Structure DCB
       Public DCBlength As Int32
       Public BaudRate As Int32
       Public fBitFields As Int32 'See Comments in Win32API.Txt
       Public wReserved As Int16
       Public XonLim As Int16
       Public XoffLim As Int16
       Public ByteSize As Byte
       Public Parity As Byte
       Public StopBits As Byte
       Public XonChar As Byte
       Public XoffChar As Byte
       Public ErrorChar As Byte
       Public EofChar As Byte
       Public EvtChar As Byte
       Public wReserved1 As Int16 'Reserved; Do Not Use
    End Structure
    
    Public Structure COMMTIMEOUTS
       Public ReadIntervalTimeout As Int32
       Public ReadTotalTimeoutMultiplier As Int32
       Public ReadTotalTimeoutConstant As Int32
       Public WriteTotalTimeoutMultiplier As Int32
       Public WriteTotalTimeoutConstant As Int32
    End Structure
    
    'Declare constants.
    Public Const GENERIC_READ As Int32 = &H80000000
    Public Const GENERIC_WRITE As Int32 = &H40000000
    Public Const OPEN_EXISTING As Int32 = 3
    Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80
    Public Const NOPARITY As Int32 = 0
    Public Const ONESTOPBIT As Int32 = 0
    
    'Declare references to external functions.
    Public Declare Auto Function CreateFile Lib "kernel32.dll" _
       (ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
          ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
             ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _
                ByVal hTemplateFile As IntPtr) As IntPtr
    
    Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
       ByRef lpDCB As DCB) As Boolean
    
    Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
       ByRef lpDCB As DCB) As Boolean
    
    Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
       ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean
    
    Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
       ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean
    
    Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
       ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _
          ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean
    
    Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
       ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _
          ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean
    
    Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean
  8. Bevor Sie auf einen seriellen oder parallelen Port zugreifen können, benötigen Sie einen Handle auf den entsprechenden Port; anschließend müssen Sie die Portkommunikationsverbindung konfigurieren. Fügen Sie hierzu in "Module1.vb" den folgenden Initialisierungscode nach der Anweisung Sub Main ein:

    Hinweis Zum Einrichten einer Kommunikationsverbindung mit dem LPTx-Port müssen Sie den Druckerspoolerdienst beenden. Verwenden Sie hierfür das Programm Dienste unter Verwaltung.
    ' Declare the local variables that you will use in the code.
    Dim hSerialPort, hParallelPort As IntPtr
    Dim Success As Boolean
    Dim MyDCB As DCB
    Dim MyCommTimeouts As COMMTIMEOUTS
    Dim BytesWritten, BytesRead As Int32
    Dim Buffer() As Byte
    
    ' Declare the variables to use for encoding.
    Dim oEncoder As New System.Text.ASCIIEncoding
    Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)
    
    ' Convert String to Byte().
    Buffer = oEnc.GetBytes("Test")
         Try
             ' Access the serial port.
             Console.WriteLine("Accessing the COM1 serial port")
             ' Obtain a handle to the COM1 serial port.
             hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
             ' Verify that the obtained handle is valid.
             If hSerialPort.ToInt32 = -1 Then
                Throw New CommException("Unable to obtain a handle to the COM1 port")
             End If
             ' Retrieve the current control settings.
             Success = GetCommState(hSerialPort, MyDCB)
             If Success = False Then
                Throw New CommException("Unable to retrieve the current control settings")
             End If
             ' Modify the properties of the retrieved DCB structure as appropriate.
             ' WARNING: Make sure to modify the properties according to their supported values.
             MyDCB.BaudRate = 9600
             MyDCB.ByteSize = 8
             MyDCB.Parity = NOPARITY
             MyDCB.StopBits = ONESTOPBIT
             ' Reconfigure COM1 based on the properties of the modified DCB structure.
             Success = SetCommState(hSerialPort, MyDCB)
             If Success = False Then
                Throw New CommException("Unable to reconfigure COM1")
             End If
             ' Retrieve the current time-out settings.
             Success = GetCommTimeouts(hSerialPort, MyCommTimeouts)
             If Success = False Then
                Throw New CommException("Unable to retrieve current time-out settings")
             End If
             ' Modify the properties of the retrieved COMMTIMEOUTS structure as appropriate.
             ' WARNING: Make sure to modify the properties according to their supported values.
             MyCommTimeouts.ReadIntervalTimeout = 0
             MyCommTimeouts.ReadTotalTimeoutConstant = 0
             MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
             MyCommTimeouts.WriteTotalTimeoutConstant = 0
             MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
             ' Reconfigure the time-out settings, based on the properties of the modified COMMTIMEOUTS structure.
             Success = SetCommTimeouts(hSerialPort, MyCommTimeouts)
             If Success = False Then
                Throw New CommException("Unable to reconfigure the time-out settings")
             End If
             ' Write data to COM1.
             Console.WriteLine("Writing the following data to COM1: Test")
             Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
             If Success = False Then
                Throw New CommException("Unable to write to COM1")
             End If
             ' Read data from COM1.
             Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero)
             If Success = False Then
                Throw New CommException("Unable to read from COM1")
             End If
          Catch ex As Exception
             Console.WriteLine(Ex.Message)
          Finally
             ' Release the handle to COM1.
             Success = CloseHandle(hSerialPort)
             If Success = False Then
                Console.WriteLine("Unable to release handle to COM1")
             End If
          End Try
    
          Try
             ' Parallel port.
             Console.WriteLine("Accessing the LPT1 parallel port")
             ' Obtain a handle to the LPT1 parallel port.
             hParallelPort = CreateFile("LPT1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
             ' Verify that the obtained handle is valid.
             If hParallelPort.ToInt32 = -1 Then
                Throw New CommException("Unable to obtain a handle to the LPT1 port")
             End If
             ' Retrieve the current control settings.
             Success = GetCommState(hParallelPort, MyDCB)
             If Success = False Then
                Throw New CommException("Unable to retrieve the current control settings")
             End If
             ' Modify the properties of the retrieved DCB structure as appropriate.
             ' WARNING: Make sure to modify the properties according to their supported values.
             MyDCB.BaudRate = 9600
             MyDCB.ByteSize = 8
             MyDCB.Parity = NOPARITY
             MyDCB.StopBits = ONESTOPBIT
             ' Reconfigure LPT1 based on the properties of the modified DCB structure.
             Success = SetCommState(hParallelPort, MyDCB)
             If Success = False Then
                Throw New CommException("Unable to reconfigure LPT1")
             End If
             ' Retrieve the current time-out settings.
             Success = GetCommTimeouts(hParallelPort, MyCommTimeouts)
             If Success = False Then
                Throw New CommException("Unable to retrieve current time-out settings")
             End If
             ' Modify the properties of the retrieved COMMTIMEOUTS structure as appropriate. 
             ' WARNING: Make sure to modify the properties according to their supported values.
             MyCommTimeouts.ReadIntervalTimeout = 0
             MyCommTimeouts.ReadTotalTimeoutConstant = 0
             MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
             MyCommTimeouts.WriteTotalTimeoutConstant = 0
             MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
             ' Reconfigure the time-out settings, based on the properties of the modified COMMTIMEOUTS structure.
             Success = SetCommTimeouts(hParallelPort, MyCommTimeouts)
             If Success = False Then
                Throw New CommException("Unable to reconfigure the time-out settings")
             End If
             ' Write data to LPT1.
            	' Note: You cannot read data from a parallel port by calling the ReadFile function.
             Console.WriteLine("Writing the following data to LPT1: Test")
             Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
             If Success = False Then
                Throw New CommException("Unable to write to LPT1")
             End If
          Catch ex As Exception
             Console.WriteLine(Ex.Message)
          Finally
             ' Release the handle to LPT1.
             Success = CloseHandle(hParallelPort)
             If Success = False Then
                Console.WriteLine("Unable to release handle to LPT1")
             End If
          End Try
    
          Console.WriteLine("Press ENTER to quit")
          Console.ReadLine()
    
  9. Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
  10. Klicken Sie im Menü Debuggen auf Start, um die Anwendung auszuführen.

    Auf der Konsole kann der folgende Text angezeigt werden:
    Zugriff auf den seriellen Port COM1 (Accessing the COM1 serial port)
    Writing the following data to COM1: (Schreibe folgende Daten auf COM1:) Test

    Read the following data from COM1: (Lese folgende Daten von COM1:) Serial Data (Serielle Daten)
    Accessing the LPT1 parallel port (Zugriff auf parallelen Port LPT1)

    Writing the following data to LPT1: (Schreibe folgende Daten auf LPT1:) Test

    Press ENTER to quit (Zum Beenden Eingabetaste drücken)
    Hinweis Serial Data (Serielle Daten) steht für die Daten, die Sie vom seriellen Port lesen.
  11. Drücken Sie zum Beenden der Anwendung in der Konsole die [EINGABETASTE].

Beispielcodelisting (Module1.vb)

Bevor Sie den folgenden Beispielcode verwenden, ersetzen Sie COM1 durch den Namen Ihres seriellen Ports und LPT1 durch den Namen Ihres parallelen Ports.

Hinweis Der folgende Code funktioniert nur, wenn serielle und parallele Geräte an die entsprechenden Ports am Computer angeschlossen sind. Falls Sie diesen Code ausführen, ohne dass derartige Geräte angeschlossen sind, wartet das Programm unendlich.
Option Strict On

' Define a CommException class that inherits from the ApplicationException class.
' Then throw an object of type CommException when you receive an error message.
Class CommException
   Inherits ApplicationException
   Sub New(ByVal Reason As String)
      MyBase.New(Reason)
   End Sub
End Class

Module Module1
      'Declare structures
      Public Structure DCB
      Public DCBlength As Int32
      Public BaudRate As Int32
      Public fBitFields As Int32
      Public wReserved As Int16
      Public XonLim As Int16
      Public XoffLim As Int16
      Public ByteSize As Byte
      Public Parity As Byte
      Public StopBits As Byte
      Public XonChar As Byte
      Public XoffChar As Byte
      Public ErrorChar As Byte
      Public EofChar As Byte
      Public EvtChar As Byte
      Public wReserved1 As Int16 'Reserved; Do Not Use
   End Structure

   Public Structure COMMTIMEOUTS
      Public ReadIntervalTimeout As Int32
      Public ReadTotalTimeoutMultiplier As Int32
      Public ReadTotalTimeoutConstant As Int32
      Public WriteTotalTimeoutMultiplier As Int32
      Public WriteTotalTimeoutConstant As Int32
   End Structure

   'Declare constants.
   Public Const GENERIC_READ As Int32 = &H80000000
   Public Const GENERIC_WRITE As Int32 = &H40000000
   Public Const OPEN_EXISTING As Int32 = 3
   Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80
   Public Const NOPARITY As Int32 = 0
   Public Const ONESTOPBIT As Int32 = 0

   'Declare references to external functions.
   Public Declare Auto Function CreateFile Lib "kernel32.dll" _
      (ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
         ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
            ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _
               ByVal hTemplateFile As IntPtr) As IntPtr

   Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
      ByRef lpDCB As DCB) As Boolean

   Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
      ByRef lpDCB As DCB) As Boolean

   Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

   Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

   Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _
         ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean

   Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _
         ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean

   Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean

   Sub Main()

      ' Declare local variables that you will use in the code.
      Dim hSerialPort, hParallelPort As IntPtr
      Dim Success As Boolean
      Dim MyDCB As DCB
      Dim MyCommTimeouts As COMMTIMEOUTS
      Dim BytesWritten, BytesRead As Int32
      Dim Buffer() As Byte

      ' Declare variables to use for encoding.
      Dim oEncoder As New System.Text.ASCIIEncoding
      Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)

      ' Convert String to Byte().
      Buffer = oEnc.GetBytes("Test")

      Try
         ' Serial port.
         Console.WriteLine("Accessing the COM1 serial port")
         ' Obtain a handle to the COM1 serial port.
         hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
         ' Verify that the obtained handle is valid.
         If hSerialPort.ToInt32 = -1 Then
            Throw New CommException("Unable to obtain a handle to the COM1 port")
         End If
         ' Retrieve the current control settings.
         Success = GetCommState(hSerialPort, MyDCB)
         If Success = False Then
            Throw New CommException("Unable to retrieve the current control settings")
         End If
         ' Modify the properties of the retrieved DCB structure as appropriate.
         ' WARNING: Make sure to modify the properties according to their supported values.
         MyDCB.BaudRate = 9600
         MyDCB.ByteSize = 8
         MyDCB.Parity = NOPARITY
         MyDCB.StopBits = ONESTOPBIT
         ' Reconfigure COM1 based on the properties of the modified DCB structure.
         Success = SetCommState(hSerialPort, MyDCB)
         If Success = False Then
            Throw New CommException("Unable to reconfigure COM1")
         End If
         ' Retrieve the current time-out settings.
         Success = GetCommTimeouts(hSerialPort, MyCommTimeouts)
         If Success = False Then
            Throw New CommException("Unable to retrieve current time-out settings")
         End If
         ' Modify the properties of the retrieved COMMTIMEOUTS structure as appropriate.
         ' WARNING: Make sure to modify the properties according to their supported values.
         MyCommTimeouts.ReadIntervalTimeout = 0
         MyCommTimeouts.ReadTotalTimeoutConstant = 0
         MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
         MyCommTimeouts.WriteTotalTimeoutConstant = 0
         MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
         ' Reconfigure the time-out settings, based on the properties of the modified COMMTIMEOUTS structure.
         Success = SetCommTimeouts(hSerialPort, MyCommTimeouts)
         If Success = False Then
            Throw New CommException("Unable to reconfigure the time-out settings")
         End If
         ' Write data to COM1.
         Console.WriteLine("Writing the following data to COM1: Test")
         Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
         If Success = False Then
            Throw New CommException("Unable to write to COM1")
         End If
         ' Read data from COM1.
         Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero)
         If Success = False Then
            Throw New CommException("Unable to read from COM1")
         End If
      Catch ex As Exception
         Console.WriteLine(Ex.Message)
      Finally
         ' Release the handle to COM1.
         Success = CloseHandle(hSerialPort)
         If Success = False Then
            Console.WriteLine("Unable to release handle to COM1")
         End If
      End Try

      Try
         ' Parallel port.
         Console.WriteLine("Accessing the LPT1 parallel port")
         ' Obtain a handle to the LPT1 parallel port.
         hParallelPort = CreateFile("LPT1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
         ' Verify that the obtained handle is valid.
         If hParallelPort.ToInt32 = -1 Then
            Throw New CommException("Unable to obtain a handle to the LPT1 port")
         End If
         ' Retrieve the current control settings.
         Success = GetCommState(hParallelPort, MyDCB)
         If Success = False Then
            Throw New CommException("Unable to retrieve the current control settings")
         End If
         ' Modify the properties of the retrieved DCB structure as appropriate.
         ' WARNING: Make sure to modify the properties according to their supported values.
         MyDCB.BaudRate = 9600
         MyDCB.ByteSize = 8
         MyDCB.Parity = NOPARITY
         MyDCB.StopBits = ONESTOPBIT
         ' Reconfigure LPT1 based on the properties of MyDCB.
         Success = SetCommState(hParallelPort, MyDCB)
         If Success = False Then
            Throw New CommException("Unable to reconfigure LPT1")
         End If
         ' Reconfigure LPT1 based on the properties of the modified DCB structure.
         Success = GetCommTimeouts(hParallelPort, MyCommTimeouts)
         If Success = False Then
            Throw New CommException("Unable to retrieve current time-out settings")
         End If
         ' Modify the properties of the retrieved COMMTIMEOUTS structure as appropriate.
         ' WARNING: Make sure to modify the properties according to their supported values.
         MyCommTimeouts.ReadIntervalTimeout = 0
         MyCommTimeouts.ReadTotalTimeoutConstant = 0
         MyCommTimeouts.ReadTotalTimeoutMultiplier = 0
         MyCommTimeouts.WriteTotalTimeoutConstant = 0
         MyCommTimeouts.WriteTotalTimeoutMultiplier = 0
         ' Reconfigure the time-out settings, based on the properties of the modified COMMTIMEOUTS structure.
         Success = SetCommTimeouts(hParallelPort, MyCommTimeouts)
         If Success = False Then
            Throw New CommException("Unable to reconfigure the time-out settings")
         End If
         ' Write data to LPT1.
         ' Note: You cannot read data from a parallel port by calling the ReadFile function.
         Console.WriteLine("Writing the following data to LPT1: Test")
         Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
         If Success = False Then
            Throw New CommException("Unable to write to LPT1")
         End If
      Catch ex As Exception
         Console.WriteLine(Ex.Message)
      Finally
         ' Release the handle to LPT1.
         Success = CloseHandle(hParallelPort)
         If Success = False Then
            Console.WriteLine("Unable to release handle to LPT1")
         End If
      End Try

      Console.WriteLine("Press ENTER to quit")
      Console.ReadLine()

   End Sub

End Module

Problembehandlung

  • Beim Ausführen der Anwendung wird möglicherweise die folgende Fehlermeldung angezeigt:
    System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Diese Fehlermeldung wird möglicherweise angezeigt, wenn Ihre Funktionsdeklarationen fehlerhaft sind. Diese Fehlermeldung tritt typischerweise auf, wenn Ihre Deklarationen ByVal-Parameter anstelle von ByRef-Parametern enthalten.
  • Ihre Anwendung gerät möglicherweise in eine unendliche Warteschleife, wenn Sie die Funktion ReadFile aufrufen. Dieses Verhalten tritt typischerweise auf, wenn Sie die Lese-Zeitüberschreitungswerte in der abgerufenen Struktur COMMTIMEOUTS auf Null festlegen. Ändern Sie die Eigenschaften der Struktur COMMTIMEOUTS entsprechend, um dieses Problem zu beheben.

Informationsquellen

Weitere Informationen finden Sie auf folgenden Microsoft Developer Network (MSDN)-Websites:
(Communications resources) Kommunikationsressourcen
http://msdn2.microsoft.com/de-de/library/aa363196.aspx

Interaktion mit nicht verwaltetem Code
http://msdn2.microsoft.com/de-de/library/sd10k43k(VS.80).aspx

System.Runtime.InteropServices-Namespace
http://msdn2.microsoft.com/de-de/library/system.runtime.interopservices(vs.71).aspx

DllImportAttribute-Klasse
http://msdn2.microsoft.com/de-de/library/system.runtime.interopservices.dllimportattribute(vs.71).aspx

The Windows API and other dynamic-link libraries (Die Windows API und andere Dynamic-Link Libraries)
http://msdn2.microsoft.com/de-de/library/aa141322(office.10).aspx

Understanding handles (Erläuterungen zu Handles)
http://msdn.microsoft.com/library/default.asp?url=/library/de-de/modcore/html/deovrUnderstandingHandles.asp

Weitere Informationen zu AT-Modembefehlen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
164660 Referenz zu AT-Modembefehlen
Hinweis Dies ist ein Artikel, der im Schnellverfahren direkt von der Microsoft-Supportorganisation erstellt wurde. Die hierin enthaltenen Informationen werden als Reaktion auf neue Probleme wie besehen bereitgestellt. Da dieser Artikel im Schnellverfahren erstellt wurde, kann er Tippfehler enthalten und zu einem späteren Zeitpunkt ohne vorherige Ankündigung überarbeitet werden. Weitere zu berücksichtigende Informationen finden Sie in den Nutzungsbedingungen.

Eigenschaften

Artikel-ID: 823179 - Geändert am: Mittwoch, 30. Oktober 2013 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbvs2005swept kbvs2005doesnotapply kbserial kbsdk kbkern32dll kbdll kbcommport kbapi kb32bitonly kbinterop kbconsole kbconfig kbappdev kbprogramming kbsample kbhowtomaster KB823179
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns