Sto scrivendo una classe per interfacciarsi con un semplice dispositivo hardware su una porta COM. Il dispositivo può essere configurato per utilizzare varie modalità, quindi la mia classe ha una funzione SetOperatingMode
, che accetta un enum
di tipo UsbDeviceMode
. Sembra qualcosa del genere:
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
};
Esiste la netta possibilità che questa operazione possa fallire a causa di un numero qualsiasi di motivi: la porta COM potrebbe non esistere più, il dispositivo potrebbe essere bloccato o fallito, o per qualsiasi ragione, l'operazione non è andata a buon fine.
Un errore sarebbe inaspettato, ma non insolito. Esistono due modalità distinte di errori: la porta COM genera un'eccezione ( TimeoutException
e InvalidOperationException
sono quelle previste). O potrei leggere un indicatore di errore sul dispositivo.
In ogni caso, se SetOperatingMode()
fallisce, il dispositivo o la comunicazione vengono interrotti in qualche modo e questa classe non può fare nulla al riguardo.
Ho 2 domande:
- Devo "pre-lanciare" il
InvalidOperationException
se la porta è chiusa? Dalla documentazione MSDN,SerialPort.Write
eSerialPort
letti verranno lanciati se la porta viene chiusa. Posso verificarlo nella parte superiore della funzione, oppure posso semplicemente lasciare che_port.Write()
lo lanci. - Dovrebbe esserci un tipo di eccezione completamente nuovo generato quando
successfulSet
èfalse
? SesuccessfulSet
èfalse
, non c'è nulla che questa classe possa fare. Dovrebbe esserci qualche eccezione diSetOperatingModeFailedException
per distinguere tra il mancato funzionamento della porta COM o il mancato funzionamento del dispositivo? Sembra piuttosto dispendioso in termini di tempo creare un'intera classe di eccezioni solo per questo punto.