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 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
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:
Inicie Microsoft Visual Studio .NET.
En el men� Archivo, seleccione
Nuevo y haga clic en Proyecto.
En Tipos de proyecto, haga clic en
Proyectos de Visual Basic.
Bajo Plantillas, haga clic en
Aplicaci�n de consola.
En el cuadro Nombre, escriba
MyConsoleApplication y haga clic en
Aceptar.
De forma predeterminada se crea
Module1.vb.
Haga clic con el bot�n secundario del mouse (rat�n) en el
proyecto MyConsoleApplication y, a continuaci�n, haga clic en
Agregar referencia.
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
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
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:
Inicie Microsoft Visual Studio .NET.
En el men� Archivo, seleccione
Nuevo y haga clic en Proyecto.
En Tipos de proyecto, haga clic en
Proyectos de Visual Basic.
Bajo Plantillas, haga clic en
Aplicaci�n de consola.
En el cuadro de texto Nombre, escriba
MyConsoleApplication y haga clic en
Aceptar.
De forma predeterminada se crea
Module1.vb.
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
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
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()
En el men� Generar, haga clic en
Generar soluci�n.
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.
Para cerrar la aplicaci�n, presione la tecla ENTRAR en la
consola.
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
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.
�Cu�nto esfuerzo ha dedicado personalmente para usar este art�culo?
Muy poco
Poco
Moderado
Mucho
Much�simo
D�ganos las razones y qu� podemos hacer para mejorar esta informaci�n
�Muchas gracias! Sus comentarios nos ayudar�n a mejorar los contenidos de soporte. Para m�s opciones de asistencia, visite la p�gina de Ayuda y soporte t�cnico.