Estoy escribiendo una aplicación en C# que utiliza la clase SerialPort
para comunicarse con algunos dispositivos. Ahora, el gran problema que he estado encontrando todo el tiempo es cómo liberar recursos de manera adecuada allí, ya que de inmediato se obtiene una excepción cuando se intenta utilizar un puerto en serie que ya se está utilizando.Liberando el puerto serie correctamente
Dado que normalmente la GC debe hacerse cargo de la mayor parte del trabajo que estoy un poco fuera de las ideas que más tratan ...
Principalmente me trataron 2 cosas que (en mi lógica) debe hacer el trabajo. Utilizo la comunicación basada en sesión, por lo que llamo a un OpenPort
y un ClosePort
método antes y después de cada comunicación, por lo que el puerto debe estar cerrado. También intenté configurar mi objeto que contiene el puerto para que sea nulo después, pero igual recibo UnauthorizedAccessExceptions
todo el tiempo, aunque estoy 100 por ciento seguro de que se ha llamado al método SerialPort.Close()
.
¿Ustedes conocen alguna forma mejor de liberar los puertos, así que dejo de obtener esa excepción?
EDIT: Gracias por las respuestas, pero las cosas Dispose() no está funcionando - Me habían intentado antes - tal vez estoy haciendo algo mal, aunque por lo que aquí está un ejemplo lo que parece mi código gusto:
En realidad es bastante como Øyvind sugirió, aunque acabo de agregar el IDisposable
- pero no funciona bien:
lo que esta sería mi clase de contenedor:
class clsRS232 : IDisposable
{
public void clsRS232()
{
Serialport port = new Serialport("COM1",9600,Parity.none,8,Stopbits.one);
}
public void openPort()
{
port.Open();
}
public void sendfunc(string str)
{
port.Write(str);
}
public string readfunc()
{
port.ReadTo("\n");
}
public void Dispose()
{
port.Dispose();
}
}
Ahora cada vez que necesito de comunicación RS232 I Cal La nueva instancia de esta manera:
clsRS232 test = new clsRS232;
test.openport();
test.sendfunc("test");
test.Dispose();
Pero eso no cambia nada - me dan un montón de UnauthorizedAccessExceptions - y si el otro tenía razón (que Dispose() de la clase SerialPort sólo contiene SerialPort.Close ()) - Bueno, entonces supongo que realmente no he cambiado nada desde mi enfoque anterior, donde tuve una llamada a función close();
gracias por sus respuestas - todavía con la esperanza de encontrar la solución :)
Gracias por la respuesta rápida, pero realmente no puedo hacerlo de esa manera, ya que he envuelto una gran cantidad de métodos propios en una clase propia, que utilizo para la comunicación serialport - todos usan el único puerto, que se inicializa cuando se llama por primera vez a la clase, así que si quisiera hacerlo de esta manera terminaría teniendo que escribir un bloque como este en todos los métodos que usan el puerto, ¿no? – Lorenz
¿Desea mantener el puerto abierto desde el momento en que crea la clase y cerrarlo cuando finalizan todas las operaciones, o desea abrir y cerrar la conexión al puerto antes y después de cada operación? –
el primero - mi clase contenedora inicia una instancia de SerialPort a través de su constructor - esto puede usarse a través de múltiples métodos para enviar/recibir, etc. pero una vez que llamo a mi propia función close() (que en este momento contiene SerialPort.Close()) Quiero que Serialport sea completamente libre para ser instanciado de nuevo. Abrir y cerrar antes y después de cada operación no funcionaría ya que, por ejemplo, habría cerrado el puerto luego de escribir algo y abrirlo de nuevo para recibir algo -> el buffer se habría ido ... – Lorenz