Estou escrevendo uma classe para fazer interface com um simples dispositivo de hardware através de uma porta COM. O dispositivo pode ser configurado para usar vários modos, para que minha classe tenha uma SetOperatingMode
função que aceite um enum
tipo UsbDeviceMode
. Parece algo como isto:
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 a possibilidade distinta de que esta operação possa falhar devido a vários motivos: A porta COM pode não existir mais, o dispositivo pode ter bloqueado ou falhou ou, por qualquer motivo, a operação falhou.
Uma falha seria inesperada, mas não incomum. Existem dois modos distintos de falhas: A porta COM gera uma exceção ( TimeoutException
e InvalidOperationException
são as esperadas). Ou eu poderia ler de volta um indicador de falha do dispositivo.
De qualquer forma, se SetOperatingMode()
falhar, o dispositivo ou a comunicação será interrompida de alguma forma, e essa classe não poderá fazer nada a respeito.
Eu tenho 2 perguntas:
- Devo "pré-lançar" o
InvalidOperationException
se a porta estiver fechada? A partir da documentação MSDN,SerialPort.Write
eSerialPort
leitura vai jogar se a porta está fechada. Eu posso verificar isso no topo da função, ou eu posso simplesmente deixá-_port.Write()
la jogar. - Deve haver um tipo de exceção totalmente novo lançado quando
successfulSet
éfalse
? SesuccessfulSet
forfalse
, não há nada que essa classe possa fazer. Deve haver algum tipo deSetOperatingModeFailedException
exceção para distinguir entre a falha da porta COM ou o dispositivo? Parece bastante demorado criar uma classe de exceção inteira apenas para esse ponto.