Problema al abrir puerto serie virtual con .NET

Iniciado por SARGE553413, 17 Julio 2014, 18:25 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

Estoy trabajando con una cámara que se conecta al PC mediante una tarjeta y un puerto FrameLink. Dicho puerto trae un software que permite emular un puerto serie para comunicarse con la cámara.

El caso es que abrir este puerto con .NET (clase SerialPort, método Open())  causa una IOException, más abajo adjunto el StackTrace.
Se qué el puerto "virtual" funciona porque lo he probado con HyperTerminal, además he probado "SerialPort::GetPortNames()" y aparece mi puerto serie "virtual".
Sé que el programa detecta que existe el puerto serie virtual porque, si no, la excepción sería distinta (comprobado).

Con HyperTerminal me conecto con los siguientes parámetros:
Bits/segundo = 2400; Bits de datos = 8; Paridad = Ninguno; Bits de parada = 1; Control de flujo: Hardware.

¿Alguien puede ayudarme por favor?

Gracias y saludos.

Adjunto la excepción (quitando el try..catch del código):


Excepción no controlada: System.IO.IOException: El parámetro no es correcto.

  en System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
  en System.IO.Ports.InternalResources.WinIOError()
  en System.IO.Ports.SerialStream.set_DtrEnable(Boolean value)
  en System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity
parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeou
t, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNul
l, Byte parityReplace)
  en System.IO.Ports.SerialPort.Open()
  en main(String[] args) en c:\documents and settings\administrador\escritorio\
dan\src\appcamarasmotor_v2\appcamarasmotor_v2\appcamarasmotor_v2.cpp:línea 20
  en mainCRTStartupStrArray(String[] arguments) en f:\dd\vctools\crt_bld\self_x
86\crt\src\mcrtexe.cpp:línea 309


Adjunto el StackTrace (caputrando la excepción y imprimiendo el StackTrace):

TargetSite: Void WinIOError(Int32, System.String)

StackTrace:
  en System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
  en System.IO.Ports.InternalResources.WinIOError()
  en System.IO.Ports.SerialStream.set_DtrEnable(Boolean value)
  en System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity
parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeou
t, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNul
l, Byte parityReplace)
  en System.IO.Ports.SerialPort.Open()
  en main(String[] args) en c:\documents and settings\administrador\escritorio\
dan\src\appcamarasmotor_v2\appcamarasmotor_v2\appcamarasmotor_v2.cpp:línea 27


y el código:

int main(array<System::String ^> ^args)
{
try{

SerialPort ^sp=gcnew SerialPort("COM2",9600,Parity::None,8,StopBits::One);
if(sp->IsOpen){
Console::WriteLine("Ya está abierto");
sp->Close();
}
sp->Open();
if(sp->IsOpen){
Console::WriteLine("OK");
sp->Close();
}else{
Console::WriteLine("PUERTO CERRADO");
}
}catch(System::IO::IOException ^ioe){
Console::WriteLine(ioe->TargetSite+"\n\n");
Console::WriteLine(ioe->StackTrace);
}
}

Eleкtro

#1
Pues solo hay 2 posibles causas:
Cita de: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.open%28v=vs.110%29.aspxIOException   
The port is in an invalid state.
- or -
An attempt to set the state of the underlying port failed. For example, the parameters passed from this SerialPort object were invalid.

Según MSDN, la propiedad "StopBits" y/o "Parity" pueden lanzar una excepción de tipo IOException.

En lugar de asignar los valores de los parámetros (y por ende de esas propiedades) mediante el Constructor, usa el constructor por defecto (sin parámetros): http://msdn.microsoft.com/en-us/library/system.io.ports.serialport%28v=vs.110%29.aspx

Y asigna el valor a las propiedades manualmente, quizás no sirva de nada, pero por probar, ya que en los ejemplos que veo en el MSDN siempre asignan la propiedad Handshake y los Timeouts también, y no he verificado cuales serán sus valores por defecto con el ctor que usaste.

Algo así (VB.NET):
Código (vbnet) [Seleccionar]
    Dim _serialPort As New SerialPort()

    With _serialPort

   .PortName = "COM2"
   .BaudRate = 9600I
   .Parity = Parity.None
   .DataBits = 8I
   .StopBits = StopBits.One
   .Handshake = Handshake.None

   .ReadTimeout = 500I
   .WriteTimeout = 500I

    End With

   _serialPort.Open()


PD: ¿Te sirvió?

Saludos