كيفية الوصول إلى المنافذ التسلسلية والمتوازية باستخدام Visual Basic.NET

للحصول على إصدار Microsoft Visual Studio 2005 من هذه المقالة، راجع
904795 .

ملخص

توضح هذه المقالة خطوة بخطوة كيفية الوصول إلى المنافذ التسلسلية وكيفية الوصول إلى المنافذ المتوازية باستخدام Microsoft Visual Basic.NET. تحتوي هذه المقالة أيضا على نموذج التعليمات البرمجية التي توضح المفاهيم الموضحة في هذه المقالة.

متطلبات

توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة وحزم الخدمات التي تحتاجها:
  • نظام التشغيل Microsoft Windows Server 2003 أو نظام التشغيل Microsoft Windows XP أو نظام التشغيل Microsoft 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 الاتصالات التسلسلية للتطبيق الخاص بك بتمكين إرسال واستقبال البيانات من خلال منفذ تسلسلي. لتطبيق أساسي الاتصالات التسلسلية باستخدام مودم، اتبع الخطوات التالية:
  1. Microsoft Visual Studio.NET.بدء تشغيل
  2. في القائمة ملف ، أشر إلى
    جديد، ثم انقر فوق المشروع.
  3. ضمن أنواع المشروع، انقر فوق مشاريع Visual Basic.
  4. ضمن قوالب، انقر فوق تطبيق وحدة التحكم.
  5. في المربع الاسم ، اكتب
    ميكونسوليبليكيشنومن ثم انقر فوق
    OK.

    بشكل افتراضي، يتم إنشاء Module1.vb.
  6. انقر فوق المشروع ميكونسوليبليكيشن، ومن ثم انقر فوق إضافة مرجع.
  7. انقر فوق علامة التبويب COM ، انقر فوق Microsoft 6.0 التحكم بالاتصالات تحت اسم المكون، انقر فوق
    حدد، ثم انقر فوق موافق.

    ملاحظة: لاستخدام عنصر تحكم MSComm ، يجب تثبيت مكونات COM ذات صلة من Microsoft Visual Basic 6.0 على نفس الكمبيوتر الذي قام Microsoft Visual Studio.NET تثبيت.

    لمزيد من المعلومات حول ترخيص مشاكل عند استخدام عناصر تحكم Visual Basic 6.0 في Visual Studio.NET، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":
    318597 الأخطاء عند استخدام عناصر تحكم Visual Basic 6.0 في Visual Studio.NET

  8. استبدال التعليمات البرمجية في 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
  9. اضغط على CRTL + F5 لإنشاء وتشغيل هذا المشروع. سوف تتلقى رسائل الإخراج التالي:
    فتح المنفذ التسلسلي.
    إرسال الأمر الانتباه إلى المودم.
    انتظار البيانات إلى المنفذ التسلسلي...
    قراءة البيانات استجابة موافق في المنفذ التسلسلي.
    إغلاق المنفذ التسلسلي.

استخدام استدعاء النظام الأساسي خدمات لاستدعاء وظائف Win32 API في Visual Basic.NET الوصول إلى المنافذ التسلسلية والمتوازية

للقيام بذلك، اتبع الخطوات التالية:
  1. Microsoft Visual Studio.NET.بدء تشغيل
  2. في القائمة ملف ، أشر إلى
    جديد، ثم انقر فوق المشروع.
  3. ضمن أنواع المشروع، انقر فوق مشاريع Visual Basic.
  4. ضمن قوالب، انقر فوق تطبيق وحدة التحكم.
  5. في مربع النص الاسم ، اكتب
    ميكونسوليبليكيشنومن ثم انقر فوق
    OK.

    بشكل افتراضي، يتم إنشاء Module1.vb.
  6. أضف التعليمات البرمجية التالية إلى Module1.vb قبل
    بيان الوحدة النمطية 1 الوحدة النمطية :
    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. قم بتعريف الهياكل والثوابت ومراجع خارجية الدالات الموجودة في الملف Kernel32.dll

    لاستدعاء الدوال غير المدارة من تطبيق Visual Basic.NET المدارة، يجب تعريف مراجع للهياكل التي يتم تمريرها كمعلمات إلى الدالات غير مدارة، ويجب أن تقوم بتعريف الثوابت التي يتم تمريرها كمعلمات إلى الوظائف غير مدارة. للقيام بذلك، إضافة التعليمات البرمجية التالية إلى 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
  8. قبل أن يمكنك الوصول إلى منفذ تسلسلي أو منفذ متوازي، يجب الحصول على مؤشر إلى المنفذ المناسب ثم قم بتكوين منفذ الاتصالات. للقيام بذلك، إضافة التعليمات البرمجية التالية التهيئة إلى 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()

  9. في بنية القائمة، انقر فوق إنشاء حلول.
  10. في القائمة " تصحيح "، انقر فوق
    بدء تشغيل التطبيق.

    ظهور النص التالي في وحدة التحكم:
    الوصول إلى المنفذ التسلسلي COM1
    كتابة البيانات التالية إلى COM1: الاختبار

    البيانات التسلسلية :COM1 قراءة البيانات التالية من
    الوصول إلى المنفذ المتوازي LPT1

    كتابة البيانات التالية إلى LPT1: الاختبار


    اضغط مفتاح ENTER لإنهاء
    ملاحظة: البيانات التسلسلية يمثل البيانات التي قمت بقراءتها من المنفذ التسلسلي.
  11. لإغلاق التطبيق، اضغط المفتاح 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 استردادها. لحل هذه المشكلة، تعديل خصائص البنية كومتيميوتس ، حسب الاقتضاء.

المراجع

لمزيد من المعلومات، قم بزيارة مواقع ويب شبكة مطوري Microsoft (MSDN) التالية:
موارد الاتصالات
http://msdn2.microsoft.com/en-us/library/aa363196.aspx

التفاعل مع التعليمات البرمجية غير المدارة
http://msdn2.microsoft.com/en-us/library/sd10k43k(vs.71).aspx

مساحة الاسم System.Runtime.InteropServices
http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices(vs.71).aspx

الفئة dllimportattribute بشكل صريح
http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute(vs.71).aspx

واجهة برمجة تطبيقات Windows ومكتبات الارتباط الديناميكي الأخرى
http://msdn2.microsoft.com/en-us/library/aa141322(office.10).aspx

فهم المقابض
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/modcore/html/deovrUnderstandingHandles.asp

لمزيد من المعلومات حول أوامر المودم AT، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":
164660 المودم في مرجع الأوامر

خصائص

رقم الموضوع: 823179 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات