COMポートを介して単純なハードウェアデバイスとインターフェイスするクラスを作成しています。デバイスはさまざまなモードを使用するように構成できるため、私のクラスにはタイプSetOperatingMode
を取り込む関数があります。次のようになります。enum
UsbDeviceMode
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
};
いくつかの理由により、この操作が失敗する可能性があります。COMポートが存在しなくなった、デバイスがロックされたか失敗した、または何らかの理由で操作が失敗した可能性があります。
失敗は予想外ですが、珍しいことではありません。障害の二つの異なるモードがあります:COMポートは、(例外をスローTimeoutException
し、InvalidOperationException
期待されるものです)。または、デバイスの障害インジケータを読み返すこともできます。
場合はいずれの場合も、SetOperatingMode()
失敗した場合、デバイスや通信が何らかの形で壊れている、このクラスはそれについて何もすることはできません。
2つの質問があります。
InvalidOperationException
ポートが閉じている場合は、「事前スロー」する必要がありますか?MSDNのドキュメントから、SerialPort.Write
およびSerialPort
ポートが閉じている場合、読み取りがスローされます。関数の一番上でそれを確認することもできますし、_port.Write()
投げるだけでもかまいません。- ときにスローされる全く新しい例外タイプがあるはず
successfulSet
ですかfalse
?場合successfulSet
でfalse
、このクラスはに行うことができます何もありません。SetOperatingModeFailedException
COMポートの障害とデバイスの障害を区別するために、何らかの例外が必要ですか?この1つのスポットのためだけに例外クラス全体を作成するのは、かなり時間がかかるようです。