Αυτό το άρθρο βήμα προς βήμα περιγράφει τον τρόπο πρόσβασης σε σειριακή
θύρες και τον τρόπο πρόσβασης σε παράλληλες θύρες, χρησιμοποιώντας το Microsoft Visual Basic.NET.
Αυτό το άρθρο περιέχει επίσης το δείγμα κώδικα που απεικονίζει τις έννοιες που είναι
που αναφέρονται σε αυτό το άρθρο.
Απαιτήσεις
Το
η λίστα που ακολουθεί περιγράφει το συνιστώμενο υλικό, λογισμικό, δίκτυο
υποδομή και service pack που χρειάζεστε:
Microsoft Windows Server 2003, Microsoft Windows XP, ή
Τα Windows 2000
Visual Basic.NET
Αυτό
το άρθρο προϋποθέτει ότι είστε εξοικειωμένοι με τα ακόλουθα θέματα:
Προγραμματισμού της Visual Basic.NET
Πλατφόρμα καλέσει υπηρεσίες σε Visual Basic.NET
Χρησιμοποιήστε το στοιχείο ελέγχου MSComm σε Visual Basic.NET πρόσβασης σειριακές θύρες
Επειδή δεν Microsoft.NET Framework κλάσεις υπάρχει πρόσβαση του
επικοινωνίες τους πόρους που είναι συνδεδεμένη στον υπολογιστή σας, μπορείτε να χρησιμοποιήσετε το MSComm στοιχείο ελέγχου σε Microsoft Visual Basic 6.0. Το MSComm στοιχείο ελέγχου παρέχει σειριακής επικοινωνίας για την εφαρμογή σας από
επιτρέπει τη μετάδοση και λήψη δεδομένων μέσω σειριακής θύρας. Για να
εφαρμογή βασικού σειριακές επικοινωνίες μέσω μόντεμ, ακολουθήστε τα εξής βήματα:
Ξεκινήστε το Microsoft Visual Studio.NET.
Από το Το αρχείο μενού, σημείοΝέα, και στη συνέχεια κάντε κλικ στο κουμπί Έργο.
Στην περιοχή Τύποι έργου, κάντε κλικ στο κουμπί Οπτική
Βασικά έργα.
Στην περιοχή Πρότυπα, κάντε κλικ στο κουμπί Κονσόλα
Εφαρμογή.
Με το Όνομα πλαίσιο, πληκτρολογήστεMyConsoleApplication, και στη συνέχεια κάντε κλικ στο κουμπίOK.
Από προεπιλογή, δημιουργείται Module1.vb.
Κάντε δεξιό κλικ του MyConsoleApplicationτο Project και στη συνέχεια κάντε κλικ Προσθήκη αναφοράς.
Κάντε κλικ στην επιλογή του COM καρτέλα, κάντε κλικ στο Microsoft
Στοιχείο ελέγχου comm 6.0 στην περιοχή Όνομα στοιχείου, κάντε κλικ στο κουμπίΕπιλέξτε, και στη συνέχεια κάντε κλικ στο κουμπί OK.
Σημείωση Για να χρησιμοποιήσετε το MSComm στοιχείο ελέγχου, πρέπει να εγκαταστήσετε τα σχετικά στοιχεία COM της Microsoft
Visual Basic 6.0 στον ίδιο υπολογιστή που διαθέτει το Microsoft Visual Studio.NET
η εγκατάσταση.
Για περισσότερες πληροφορίες σχετικά με ζητήματα κατά τη χρήση του Visual
Βασικό 6.0 ελέγχους στο Visual Studio.NET, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να
προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
Σφάλματα κατά τη χρήση στοιχείων ελέγχου της Visual Basic 6.0 στο Visual Studio.NET
Αντικατάσταση κώδικα Module1.vb με τον ακόλουθο κώδικα
παράδειγμα.
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
Πιέστε το συνδυασμό πλήκτρων CRTL + F5 για να δημιουργήσετε και να εκτελέσετε αυτό το έργο. Θα
λάβετε τα ακόλουθα μηνύματα εξόδου:
Ανοίξτε το σειριακό
θύρα. Αποστολή εντολής προσοχή στο μόντεμ. Περιμένετε για δεδομένα έλθουν
Επιστροφή στη σειριακή θύρα... Ανάγνωση δεδομένων OK απόκρισης σε σειριακό
θύρα. Κλείστε τη σειριακή θύρα.
Χρήση πλατφόρμας καλέσει υπηρεσίες κλήσης Win32 API συναρτήσεις της Visual Basic.NET σειριακές και παράλληλες θύρες πρόσβασης
Ακολουθήστε τα εξής βήματα:
Ξεκινήστε το Microsoft Visual Studio.NET.
Από το Το αρχείο μενού, σημείοΝέα, και στη συνέχεια κάντε κλικ στο κουμπί Έργο.
Στην περιοχή Τύποι έργου, κάντε κλικ στο κουμπί Οπτική
Βασικά έργα.
Στην περιοχή Πρότυπα, κάντε κλικ στο κουμπί Κονσόλα
Εφαρμογή.
Με το Όνομα πλαίσιο κειμένου, πληκτρολογήστεMyConsoleApplication, και στη συνέχεια κάντε κλικ στο κουμπίOK.
Από προεπιλογή, δημιουργείται Module1.vb.
Προσθέστε τον παρακάτω κώδικα για να Module1.vb πριν από τηνΛειτουργική μονάδα Module1 δήλωση:
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
Δηλώστε δομές, σταθερές και αναφορές εξωτερικά
λειτουργίες που είναι στο Kernel32.dll
Για να καλέσετε συναρτήσεις μη διαχειριζόμενη από
διαχειριζόμενες Visual Basic.ΚΑΘΑΡΉ εφαρμογή, πρέπει να δηλώσετε αναφορές για το
δομές που μεταβιβάζετε ως παράμετροι μη διαχειριζόμενη λειτουργίες και πρέπει να
Δηλώστε τις σταθερές που μεταβιβάζετε ως παράμετροι μη διαχειριζόμενη λειτουργίες.
Για να το κάνετε αυτό, προσθέστε τον παρακάτω κώδικα για να Module1.vb μετά την Λειτουργική μονάδα Module1 δήλωση:
'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
Προτού αποκτήσετε πρόσβαση σε μια σειριακή ή παράλληλη θύρα, μπορείτε
πρέπει να αποκτήσετε ένα δείκτη χειρισμού στην κατάλληλη θύρα και να ρυθμίσετε τις παραμέτρους της θύρας
επικοινωνίες. Για να το κάνετε αυτό, προσθέστε τον ακόλουθο κώδικα προετοιμασίας για Module1.vb
μετά την Sub Main η πρόταση.
Σημείωση Επικοινωνία με το LPTx θύρα, πρέπει να διακόψετε την υπηρεσία "ουρά εκτύπωσης". Για να γίνει αυτό, χρησιμοποιήστε
το εργαλείο "Υπηρεσίες" στα εργαλεία διαχείρισης.
' 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()
Από το Δόμηση μενού, κάντε κλικ στο κουμπί Δόμηση
Λύση.
Από το Ο εντοπισμός σφαλμάτων μενού, κάντε κλικ στο κουμπίΈναρξη Για να εκτελέσετε την εφαρμογή.
Ενδέχεται να λάβετε το
ακολουθεί το κείμενο της κονσόλας:
Το COM1 πρόσβαση
σειριακή θύρα Εγγραφή των ακόλουθων δεδομένων COM1: δοκιμή
Ανάγνωση του
παρακάτω δεδομένα από COM1: Σειριακή δεδομένων Πρόσβαση σε
παράλληλη θύρα LPT1
Εγγραφή των ακόλουθων δεδομένων στη θύρα LPT1: δοκιμή
Πιέστε το πλήκτρο ENTER για να τερματίσετε
Σημείωση Σειριακή δεδομένων αναπαριστά τα δεδομένα που
ανάγνωση από τη σειριακή θύρα.
Για να κλείσετε την εφαρμογή, πιέστε το πλήκτρο ENTER στο του
κονσόλα.
Καταχώρηση δείγμα κώδικα (Module1.vb)
Πριν χρησιμοποιήσετε το ακόλουθο παράδειγμα κώδικα, αντικατάσταση COM1 με το όνομα της σειριακής θύρας και αντικατάσταση ΘΎΡΑ LPT1 με το όνομα της παράλληλης θύρας.
Σημείωση Ο παρακάτω κώδικας λειτουργεί μόνο όταν συσκευές σειριακές και παράλληλες
συσκευές είναι συνδεδεμένες στις αντίστοιχες θύρες του υπολογιστή. Εάν δεν το κάνετε
Αυτές οι συσκευές συνδέονται και εκτελέστε το πρόγραμμα, το πρόγραμμα θα περιμένει απεριόριστα.
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
Αντιμετώπιση προβλημάτων
Όταν εκτελείτε την εφαρμογή, ενδέχεται να λάβετε το ακόλουθο
μήνυμα λάθους:
System.NullReferenceException: το αντικείμενο
η αναφορά δεν έχει οριστεί σε μια παρουσία του αντικειμένου.
Ενδέχεται να εμφανιστεί αυτή
εμφανίζεται το μήνυμα λάθους επειδή σας δηλώσεις συνάρτηση είναι εσφαλμένη. Αυτό το σφάλμα
το μήνυμα εμφανίζεται συνήθως όταν περιέχει δηλώσεις σας ByVal παράμετροι αντί ByRef παράμετροι.
Η εφαρμογή σας μπορεί να περιμένει απεριόριστα όταν καλέσετε το Τη συνάρτηση ReadFile η συνάρτηση. Αυτή η συμπεριφορά συνήθως προκύπτει όταν ορίζετε την ανάγνωση
λήξεις χρονικών ορίων μηδέν τα ανακτημένα COMMTIMEOUTS δομή. Για να επιλύσετε αυτό το ζήτημα, τροποποιήστε τις ιδιότητες του COMMTIMEOUTS δομή, ανάλογα με την περίπτωση.
Για περισσότερες πληροφορίες σχετικά με μόντεμ
εντολές, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της
Γνωσιακή Βάση της Microsoft:
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:823179
Σας ευχαριστούμε! Τα σχόλιά σας θα μας βοηθήσουν να βελτιώσουμε το περιεχόμενο υποστήριξης. Για περισσότερες επιλογές βοήθειας, επισκεφτείτε την αρχική σελίδα της Βοήθειας και υποστήριξης.