Estoy escribiendo una clase para interactuar con un dispositivo de hardware simple a través de un puerto COM. El dispositivo se puede configurar para usar varios modos, por lo que mi clase tiene una SetOperatingMode
función, que toma una enum
de tipo UsbDeviceMode
. Se ve algo como esto:
class UsbDevice
{
public void SetOperatingMode(UsbDeviceMode mode)
{
byte[] buffer = new byte[4];
buffer[0] = 0x5A;
buffer[1] = 0x02;
buffer[2] = (byte)mode;
buffer[3] = 0x00; //IO_TYPE is always 0 in this case.
_port.Write(buffer, 0, 4);
int read = _port.Read(buffer, 0, 2);
bool successfulSet = (read == 2 && buffer[0] == 0xFF && buffer[1] == 0x00);
}
}
enum UsbDeviceMode
{
IO_MODE = 0x00,
IO_CHANGE = 0x10,
I2C_S_20KHZ = 0x20,
I2C_S_50KHZ = 0x30,
I2C_S_100KHZ = 0x40,
I2C_S_400KHZ = 0x50,
I2C_H_100KHZ = 0x60,
I2C_H_400KHZ = 0x70,
I2C_H_1000KHZ = 0x80,
SPI_MODE = 0x90,
SERIAL = 0x01
};
Existe la clara posibilidad de que esta operación pueda fallar debido a varias razones: el puerto COM ya no existe, el dispositivo puede haberse bloqueado o fallado, o por alguna razón, la operación falló.
Un fracaso sería inesperado, pero no infrecuente. Hay dos modos distintos de fallas: el puerto COM genera una excepción ( TimeoutException
y InvalidOperationException
es la esperada). O podría leer un indicador de falla del dispositivo.
En cualquier caso, si SetOperatingMode()
falla, entonces el dispositivo o la comunicación se interrumpe de alguna manera, y esta clase no puede hacer nada al respecto.
Tengo 2 preguntas:
- ¿Debo "pre-tirar" el
InvalidOperationException
si el puerto está cerrado? De la documentación de MSDN,SerialPort.Write
ySerialPort
leer lanzará si el puerto está cerrado. Puedo verificar eso en la parte superior de la función, o simplemente puedo dejarlo_port.Write()
tirar. - ¿Debería haber un tipo de excepción completamente nuevo cuando
successfulSet
esfalse
? SisuccessfulSet
es asífalse
, no hay nada que esta clase pueda hacer. ¿Debería haber algún tipo deSetOperatingModeFailedException
excepción para distinguir entre la falla del puerto COM o la falla del dispositivo? Parece bastante lento crear una clase de excepción completa solo para este lugar.
fuente