Id. de art�culo: 823179 - �ltima revisi�n: s�bado, 12 de mayo de 2007 - Versi�n: 3.1

C�mo obtener acceso a los puertos serie y paralelo usando Visual Basic .NET

Nota acerca de su sistema operativoEste art�culo se aplica a un sistema operativo distinto al que usa. El contenido del art�culo que puede que no sea importante para usted, se deshabilitar�
Para obtener una versi�n de Microsoft Visual Studio 2005 de este art�culo, consulte 904795 (http://support.microsoft.com/kb/904795/ ) .

En esta p�gina

Expandir todo | Contraer todo

Resumen

En este art�culo paso a paso se describe c�mo tener acceso a los puertos serie y paralelo utilizando Microsoft Visual Basic .NET. Este art�culo tambi�n contiene c�digo de ejemplo que ilustra los conceptos explicados en este art�culo

Requisitos

En la lista siguiente se detallan las recomendaciones de hardware, software, infraestructura de red y Service Pack necesarios:
  • Microsoft Windows Server 2003, Microsoft Windows XP o Microsoft Windows 2000
  • Visual Basic .NET
En el presente art�culo se da por supuesto que est� familiarizado con los temas siguientes:
  • Programar en Visual Basic .NET
  • Servicios de invocaci�n de plataforma en Visual Basic .NET

Usar el control MSComm en Visual Basic .NET para tener acceso a los puertos serie

Como no existe ninguna clase de Microsoft .NET Framework para tener acceso a los recursos de comunicaciones conectados a su equipo, puede utilizar el control MSComm de Microsoft Visual Basic 6.0. El control MSComm proporciona comunicaciones serie para su aplicaci�n habilitando la transmisi�n y recepci�n de datos a trav�s de un puerto serie. Para implementar comunicaciones serie b�sicas utilizando un m�dem, siga estos pasos:
  1. Inicie Microsoft Visual Studio .NET.
  2. En el men� Archivo, seleccione Nuevo y haga clic en Proyecto.
  3. En Tipos de proyecto, haga clic en Proyectos de Visual Basic.
  4. Bajo Plantillas, haga clic en Aplicaci�n de consola.
  5. En el cuadro Nombre, escriba MyConsoleApplication y haga clic en Aceptar.

    De forma predeterminada se crea Module1.vb.
  6. Haga clic con el bot�n secundario del mouse (rat�n) en el proyecto MyConsoleApplication y, a continuaci�n, haga clic en Agregar referencia.
  7. Haga clic en la ficha COM, haga clic en Microsoft Comm Control 6.0 bajo Nombre del componente, haga clic en Seleccionar y, a continuaci�n, haga clic en Aceptar.

    Nota
    Para utilizar el control MSComm, debe instalar los componentes COM relacionados de Microsoft Visual Basic 6.0 en el mismo equipo donde est� instalado Microsoft Visual Studio .NET.

    Para obtener m�s informaci�n acerca de los problemas de licencia de utilizar controles de Visual Basic 6.0 en Visual Studio .NET, haga clic en el n�mero de art�culo siguiente para verlo en Microsoft Knowledge Base:
    318597 (http://support.microsoft.com/kb/318597/ ) Se producen errores al utilizar controles de Visual Basic 6.0 en Visual Studio .NET
  8. Reemplace el c�digo de Module1.vb con el c�digo de ejemplo siguiente.
    Imports MSCommLib
    
    Module Module1
    
        Sub Main() 'New a MSComm control Dim MSComm1 As MSComm MSComm1 = New MSComm ' Almacenar en b�fer la cadena de entrada. Dim Buffer As String ' Usar el puerto serie COM1. MSComm1.CommPort = 1 ' 9600 baudios, sin paridad, 8 bits de datos y 1 bit de parada. MSComm1.Settings = "9600,N,8,1" ' Indicar al control que lea todo el b�fer cuando se utilice Input. MSComm1.InputLen = 0 ' Abrir el puerto serie. MSComm1.PortOpen = True Console.WriteLine("Abrir el puerto serie.") ' Indicar al control que haga que la propiedad Input devuelva datos de texto. MSComm1.InputMode() = InputModeConstants.comInputModeText 'Borrar el b�fer de recepci�n. MSComm1.InBufferCount() = 0 ' Enviar el comando de atenci�n al m�dem. MSComm1.Output = "ATV1Q0" & Chr(13) Console.WriteLine("Enviar el comando de atenci�n al m�dem.") Console.WriteLine("Esperar que los datos vuelvan al puerto serie...") ' Asegurarse de que el m�dem responde con "OK". ' Esperar que los datos vuelvan al puerto serie. Do Buffer = Buffer & MSComm1.Input Loop Until InStr(Buffer, "OK" & vbCrLf) ' Leer los datos de la respuesta "OK" en el puerto serie. ' Cerrar el puerto serie. Console.WriteLine("Leer los datos de la respuesta OK en el puerto serie".) MSComm1.PortOpen = False Console.WriteLine("Cerrar el puerto serie.") End Sub
    
    End Module
  9. Presione CRTL+F5 para generar y ejecutar este proyecto. Aparecer�n los mensajes siguientes:
    Abrir el puerto serie.
    Enviar el comando de atenci�n al m�dem.
    Esperar que los datos vuelvan al puerto serie...
    Leer los datos de la respuesta OK en el puerto serie.
    Cerrar el puerto serie.

Utilizar servicios de invocaci�n de plataforma para llamar a funciones de API Win32 en Visual Basic .NET con el fin de obtener acceso a los puertos serie y paralelo

Para ello, siga estos pasos:
  1. Inicie Microsoft Visual Studio .NET.
  2. En el men� Archivo, seleccione Nuevo y haga clic en Proyecto.
  3. En Tipos de proyecto, haga clic en Proyectos de Visual Basic.
  4. Bajo Plantillas, haga clic en Aplicaci�n de consola.
  5. En el cuadro de texto Nombre, escriba MyConsoleApplication y haga clic en Aceptar.

    De forma predeterminada se crea Module1.vb.
  6. Agregue el c�digo siguiente a Module1.vb antes de la instrucci�n Module Module1:
    Option Strict On
    
    ' Definir una clase CommException que herede de la clase ApplicationException ' e iniciar un objeto de tipo CommException al recibir un mensaje de error. Class CommException Inherits ApplicationException Sub New(ByVal Reason As String) MyBase.New(Reason) End Sub End Class
  7. Declare estructuras, constantes y referencias a funciones externas que est�n en Kernel32.dll

    Para llamar a funciones no administradas desde su aplicaci�n de Visual Basic .NET administrada, debe declarar referencias a las estructuras que pasa como par�metros a las funciones no administradas y debe declarar las constantes que pasa como par�metros a las funciones no administradas. Para ello, agregue el c�digo siguiente a Module1.vb despu�s de la instrucci�n Module Module1:
    'Declarar estructuras. Public Structure DCB Public DCBlength As Int32 Public BaudRate As Int32 Public fBitFields As Int32 'Ver los comentarios de 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 'Reservado; no usar 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
    
    'Declarar constantes. 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
    
    'Declarar referencias a funciones externas. 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. Antes de poder tener acceso a un puerto serie o a un puerto paralelo, debe obtener un identificador para el puerto adecuado y configurar despu�s las comunicaciones del puerto. Para ello, agregue el c�digo de inicializaci�n siguiente a Module1.vb despu�s de la instrucci�n Sub Main.

    Nota
    Para establecer comunicaci�n con el puerto LPTx, debe detener el servicio Cola de impresi�n. Para ello, utilice la herramienta Servicios de Herramientas administrativas.
    ' Declarar las variables local que utilizar� en el c�digo. 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
    
    ' Declarar las variables que utilizar� para codificar. Dim oEncoder As New System.Text.ASCIIEncoding Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)
    
    ' Convertir String en Byte(). Buffer = oEnc.GetBytes("Prueba") Try ' Tener acceso al puerto serie. Console.WriteLine("Teniendo acceso al puerto serie COM1") ' Obtener un identificador para el puerto serie COM1. hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero) ' Comprobar que el identificador obtenido es v�lido. If hSerialPort.ToInt32 = -1 Then Throw New CommException("No se puede obtener un identificador para el puerto COM1") End If ' Recuperar la configuraci�n actual del control. Success = GetCommState(hSerialPort, MyDCB) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual del control") End If ' Modificar las propiedades de la estructura DCB recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyDCB.BaudRate = 9600 MyDCB.ByteSize = 8 MyDCB.Parity = NOPARITY MyDCB.StopBits = ONESTOPBIT ' Reconfigurar COM1 seg�n las propiedades de la estructura DCB modificada. Success = SetCommState(hSerialPort, MyDCB) If Success = False Then Throw New CommException("No se puede reconfigurar COM1") End If ' Recuperar la configuraci�n actual de tiempo de espera. Success = GetCommTimeouts(hSerialPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual de tiempo de espera") End If ' Modificar las propiedades de la estructura COMMTIMEOUTS recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyCommTimeouts.ReadIntervalTimeout = 0 MyCommTimeouts.ReadTotalTimeoutConstant = 0 MyCommTimeouts.ReadTotalTimeoutMultiplier = 0 MyCommTimeouts.WriteTotalTimeoutConstant = 0 MyCommTimeouts.WriteTotalTimeoutMultiplier = 0 ' Reconfigurar el tiempo de espera seg�n las propiedades de la estructura COMMTIMEOUTS modificada. Success = SetCommTimeouts(hSerialPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede reconfigurar el tiempo de espera") End If ' Escribir datos en COM1. Console.WriteLine("Escribiendo los datos siguientes en COM1: Prueba") Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero) If Success = False Then Throw New CommException("No se puede escribir en COM1") End If ' Leer datos de COM1. Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero) If Success = False Then Throw New CommException("No se puede leer de COM1") End If Catch ex As Exception Console.WriteLine(Ex.Message) Finally ' Liberar el identificador para COM1. Success = CloseHandle(hSerialPort) If Success = False Then Console.WriteLine("No se puede liberar identificador para COM1") End If End Try
    
          Try ' Puerto paralelo. Console.WriteLine("Teniendo acceso al puerto paralelo LPT1") ' Obtener un identificador para el puerto paralelo LPT1. hParallelPort = CreateFile("LPT1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero) ' Comprobar que el identificador obtenido es v�lido. If hParallelPort.ToInt32 = -1 Then Throw New CommException("No se puede obtener un identificador para el puerto LPT1") End If ' Recuperar la configuraci�n actual del control. Success = GetCommState(hParallelPort, MyDCB) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual del control") End If ' Modificar las propiedades de la estructura DCB recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyDCB.BaudRate = 9600 MyDCB.ByteSize = 8 MyDCB.Parity = NOPARITY MyDCB.StopBits = ONESTOPBIT ' Reconfigurar LPT1 seg�n las propiedades de la estructura DCB modificada. Success = SetCommState(hParallelPort, MyDCB) If Success = False Then Throw New CommException("No se puede reconfigurar LPT1") End If ' Recuperar la configuraci�n actual de tiempo de espera. Success = GetCommTimeouts(hParallelPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual de tiempo de espera") End If ' Modificar las propiedades de la estructura COMMTIMEOUTS recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyCommTimeouts.ReadIntervalTimeout = 0 MyCommTimeouts.ReadTotalTimeoutConstant = 0 MyCommTimeouts.ReadTotalTimeoutMultiplier = 0 MyCommTimeouts.WriteTotalTimeoutConstant = 0 MyCommTimeouts.WriteTotalTimeoutMultiplier = 0 ' Reconfigurar el tiempo de espera seg�n las propiedades de la estructura COMMTIMEOUTS modificada. Success = SetCommTimeouts(hParallelPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede reconfigurar el tiempo de espera") End If ' Escribir datos en LPT1. ' Nota: no puede leer datos de un puerto paralelo llamando a la funci�n ReadFile. Console.WriteLine("Escribiendo los datos siguientes en LPT1: Prueba") Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero) If Success = False Then Throw New CommException("No se puede escribir en LPT1") End If Catch ex As Exception Console.WriteLine(Ex.Message) Finally ' Liberar el identificador para LPT1. Success = CloseHandle(hParallelPort) If Success = False Then Console.WriteLine("No se puede liberar identificador para LPT1") End If End Try
    
          Console.WriteLine("Presione ENTRAR para salir") Console.ReadLine() 
  9. En el men� Generar, haga clic en Generar soluci�n.
  10. En el men� Depurar, haga clic en Iniciar para ejecutar la aplicaci�n.

    Puede recibir el texto siguiente en la consola:
    Teniendo acceso al puerto serie COM1
    Escribiendo los datos siguientes en COM1: Prueba

    Leer los datos siguientes de COM1: Datos serie
    Teniendo acceso al puerto paralelo LPT1

    Escribiendo los datos siguientes en LPT1: Prueba

    Presione ENTRAR para salir.
    Nota
    Datos serie representa los datos que lee del puerto serie.
  11. Para cerrar la aplicaci�n, presione la tecla ENTRAR en la consola.

Lista de c�digo de ejemplo (Module1.vb)

Antes de usar el ejemplo de c�digo siguiente, reemplace COM1 con el nombre de su puerto serie y reemplace LPT1 con el nombre de su puerto paralelo.

Nota
El c�digo siguiente s�lo funciona cuando los dispositivos serie y los dispositivos paralelo est�n conectados a los puertos correspondientes del equipo. Si no conecta estos dispositivos y ejecuta el programa, �ste esperar� indefinidamente.
Option Strict On

' Definir una clase CommException que herede de la clase ApplicationException. ' Iniciar despu�s un objeto de tipo CommException al recibir un mensaje de error. Class CommException Inherits ApplicationException Sub New(ByVal Reason As String) MyBase.New(Reason) End Sub End Class

Module Module1 'Declarar estructuras 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 'Reservado; no usar 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

   'Declarar constantes. 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

   'Declarar referencias a funciones externas. 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()

      ' Declarar variables locales que utilizar� en el c�digo. 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

      ' Declarar las variables que utilizar� para codificar. Dim oEncoder As New System.Text.ASCIIEncoding Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)

      ' Convertir String en Byte(). Buffer = oEnc.GetBytes("Prueba")

      Try ' Puerto serie. Console.WriteLine("Teniendo acceso al puerto serie COM1") ' Obtener un identificador para el puerto serie COM1. hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero) ' Comprobar que el identificador obtenido es v�lido. If hSerialPort.ToInt32 = -1 Then Throw New CommException("No se puede obtener un identificador para el puerto COM1") End If ' Recuperar la configuraci�n actual del control. Success = GetCommState(hSerialPort, MyDCB) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual del control") End If ' Modificar las propiedades de la estructura DCB recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyDCB.BaudRate = 9600 MyDCB.ByteSize = 8 MyDCB.Parity = NOPARITY MyDCB.StopBits = ONESTOPBIT ' Reconfigurar COM1 seg�n las propiedades de la estructura DCB modificada. Success = SetCommState(hSerialPort, MyDCB) If Success = False Then Throw New CommException("No se puede reconfigurar COM1") End If ' Recuperar la configuraci�n actual de tiempo de espera. Success = GetCommTimeouts(hSerialPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual de tiempo de espera") End If ' Modificar las propiedades de la estructura COMMTIMEOUTS recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyCommTimeouts.ReadIntervalTimeout = 0 MyCommTimeouts.ReadTotalTimeoutConstant = 0 MyCommTimeouts.ReadTotalTimeoutMultiplier = 0 MyCommTimeouts.WriteTotalTimeoutConstant = 0 MyCommTimeouts.WriteTotalTimeoutMultiplier = 0 ' Reconfigurar el tiempo de espera seg�n las propiedades de la estructura COMMTIMEOUTS modificada. Success = SetCommTimeouts(hSerialPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede reconfigurar el tiempo de espera") End If ' Escribir datos en COM1. Console.WriteLine("Escribiendo los datos siguientes en COM1: Prueba") Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero) If Success = False Then Throw New CommException("No se puede escribir en COM1") End If ' Leer datos de COM1. Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero) If Success = False Then Throw New CommException("No se puede leer de COM1") End If Catch ex As Exception Console.WriteLine(Ex.Message) Finally ' Liberar el identificador para COM1. Success = CloseHandle(hSerialPort) If Success = False Then Console.WriteLine("No se puede liberar identificador para COM1") End If End Try

      Try ' Puerto paralelo. Console.WriteLine("Teniendo acceso al puerto paralelo LPT1") ' Obtener un identificador para el puerto paralelo LPT1. hParallelPort = CreateFile("LPT1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero) ' Comprobar que el identificador obtenido es v�lido. If hParallelPort.ToInt32 = -1 Then Throw New CommException("No se puede obtener un identificador para el puerto LPT1") End If ' Recuperar la configuraci�n actual del control. Success = GetCommState(hParallelPort, MyDCB) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual del control") End If ' Modificar las propiedades de la estructura DCB recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyDCB.BaudRate = 9600 MyDCB.ByteSize = 8 MyDCB.Parity = NOPARITY MyDCB.StopBits = ONESTOPBIT ' Reconfigurar LPT1 seg�n las propiedades de MyDCB. Success = SetCommState(hParallelPort, MyDCB) If Success = False Then Throw New CommException("No se puede reconfigurar LPT1") End If ' Reconfigurar LPT1 seg�n las propiedades de la estructura DCB modificada. Success = GetCommTimeouts(hParallelPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede recuperar la configuraci�n actual de tiempo de espera") End If ' Modificar las propiedades de la estructura COMMTIMEOUTS recuperada de forma adecuada. ' ADVERTENCIA: aseg�rese de modificar las propiedades seg�n sus valores compatibles. MyCommTimeouts.ReadIntervalTimeout = 0 MyCommTimeouts.ReadTotalTimeoutConstant = 0 MyCommTimeouts.ReadTotalTimeoutMultiplier = 0 MyCommTimeouts.WriteTotalTimeoutConstant = 0 MyCommTimeouts.WriteTotalTimeoutMultiplier = 0 ' Reconfigurar el tiempo de espera seg�n las propiedades de la estructura COMMTIMEOUTS modificada. Success = SetCommTimeouts(hParallelPort, MyCommTimeouts) If Success = False Then Throw New CommException("No se puede reconfigurar el tiempo de espera") End If ' Escribir datos en LPT1. ' Nota: no puede leer datos de un puerto paralelo llamando a la funci�n ReadFile. Console.WriteLine("Escribiendo los datos siguientes en LPT1: Prueba") Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero) If Success = False Then Throw New CommException("No se puede escribir en LPT1") End If Catch ex As Exception Console.WriteLine(Ex.Message) Finally ' Liberar el identificador para LPT1. Success = CloseHandle(hParallelPort) If Success = False Then Console.WriteLine("No se puede liberar identificador para LPT1") End If End Try

      Console.WriteLine("Presione ENTRAR para salir") Console.ReadLine() 

   End Sub

End Module

Solucionar problemas

  • Al ejecutar la aplicaci�n puede recibir el mensaje de error siguiente:
    System.NullReferenceException: Referencia a objeto no establecida como instancia de un objeto.
    Puede recibir este mensaje de error porque sus declaraciones de funci�n son incorrectas. Este mensaje de error suele aparecer cuando las declaraciones contienen par�metros ByVal en lugar de ByRef.
  • Su aplicaci�n puede esperar indefinidamente al invocar la funci�n ReadFile. Este comportamiento suele producirse al establecer los tiempos de espera de lectura en cero en la estructura COMMTIMEOUTS recuperada. Para resolver este problema, modifique las propiedades de la estructura COMMTIMEOUTS seg�n corresponda.

Referencias

Para obtener m�s informaci�n al respecto, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
Recursos de comunicaciones
http://msdn2.microsoft.com/en-us/library/aa363196.aspx (http://msdn2.microsoft.com/en-us/library/aa363196.aspx)

Interoperaci�n con c�digo no administrado
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconinteroperatingwithunmanagedcode.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconinteroperatingwithunmanagedcode.asp)

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

Clase DllImportAttribute
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesDllImportAttributeClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesDllImportAttributeClassTopic.asp)

La API de Windows y otras bibliotecas de v�nculos din�micos
http://msdn2.microsoft.com/en-us/library/aa141322(office.10).aspx (http://msdn2.microsoft.com/en-us/library/aa141322(office.10).aspx)

Descripci�n de los identificadores
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/modcore/html/deovrUnderstandingHandles.asp (http://msdn2.microsoft.com/en-us/library/aa141354(office.10).aspx)

Control MSComm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/comm98/html/vbobjcomm.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/comm98/html/vbobjcomm.asp)
Para obtener m�s informaci�n acerca de los comandos AT de m�dem, haga clic en el n�mero de art�culo siguiente para verlo en Microsoft Knowledge Base:
164660 (http://support.microsoft.com/kb/164660/ ) Referencia al comando de m�dem AT

La informaci�n de este art�culo se refiere a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave:�
kbvs2005swept kbvs2005doesnotapply kbserial kbsdk kbkern32dll kbdll kbcommport kbapi kb32bitonly kbinterop kbconsole kbconfig kbappdev kbprogramming kbsample kbhowtomaster KB823179