Ich schreibe eine Klasse für die Schnittstelle mit einem einfachen Hardwaregerät über einen COM-Port. Das Gerät kann für die Verwendung verschiedener Modi konfiguriert werden, sodass meine Klasse eine SetOperatingMode
Funktion hat, die einen enum
Typ annimmt UsbDeviceMode
. Es sieht ungefähr so aus:
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
};
Es besteht die eindeutige Möglichkeit, dass dieser Vorgang aus einer Reihe von Gründen fehlschlägt: Der COM-Anschluss ist möglicherweise nicht mehr vorhanden, das Gerät ist möglicherweise gesperrt oder fehlgeschlagen, oder aus irgendeinem Grund ist der Vorgang fehlgeschlagen.
Ein Fehler wäre unerwartet, aber nicht ungewöhnlich. Es gibt zwei verschiedene Arten von Fehlern: Der COM-Port löst eine Ausnahme aus ( TimeoutException
und InvalidOperationException
ist die erwartete). Oder ich könnte eine Fehleranzeige des Geräts zurücklesen.
Wenn dies SetOperatingMode()
fehlschlägt, ist das Gerät oder die Kommunikation in jedem Fall irgendwie unterbrochen, und diese Klasse kann nichts dagegen tun.
Ich habe 2 Fragen:
- Sollte ich das "vorwerfen",
InvalidOperationException
wenn der Port geschlossen ist? Aus der MSDN-Dokumentation,SerialPort.Write
undSerialPort
read wird ausgelöst, wenn der Port geschlossen ist. Ich kann das ganz oben in der Funktion überprüfen, oder ich kann es einfach_port.Write()
werfen lassen. - Sollte es eine völlig neue Ausnahmetyp geworfen werden , wenn
successfulSet
istfalse
? WennsuccessfulSet
istfalse
, gibt es nichts , dass diese Klasse zu tun. Sollte es eineSetOperatingModeFailedException
Ausnahme geben, um zwischen einem fehlerhaften COM-Anschluss und einem fehlerhaften Gerät zu unterscheiden? Es scheint ziemlich zeitaufwändig zu sein, eine ganze Ausnahmeklasse nur für diesen einen Punkt zu erstellen.
quelle