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 SetOperatingModefunción, que toma una enumde 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 ( TimeoutExceptiony InvalidOperationExceptiones 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
InvalidOperationExceptionsi el puerto está cerrado? De la documentación de MSDN,SerialPort.WriteySerialPortleer 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
successfulSetesfalse? SisuccessfulSetes asífalse, no hay nada que esta clase pueda hacer. ¿Debería haber algún tipo deSetOperatingModeFailedExceptionexcepció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
