Tôi đang viết một lớp để giao diện với một thiết bị phần cứng đơn giản qua cổng COM. Thiết bị có thể được cấu hình để sử dụng các chế độ khác nhau, vì vậy lớp của tôi có một SetOperatingMode
chức năng, có một enum
loại UsbDeviceMode
. Nó trông giống như thế này:
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
};
Có khả năng khác biệt là hoạt động này có thể thất bại do bất kỳ lý do nào: Cổng COM có thể không còn tồn tại, thiết bị có thể bị khóa hoặc thất bại hoặc vì lý do nào đó, hoạt động không thành công.
Một thất bại sẽ là bất ngờ, nhưng không phải là hiếm. Có hai chế độ thất bại riêng biệt: Cổng COM đưa ra một ngoại lệ ( TimeoutException
và InvalidOperationException
là chế độ được mong đợi). Hoặc tôi có thể đọc lại một chỉ báo lỗi thiết bị.
Trong mọi trường hợp, nếu SetOperatingMode()
thất bại, thì thiết bị hoặc giao tiếp bị hỏng theo cách nào đó và lớp này không thể làm bất cứ điều gì về nó.
Tôi có 2 câu hỏi:
- Tôi có nên "ném trước"
InvalidOperationException
nếu cổng bị đóng không? Từ tài liệu MSDN,SerialPort.Write
vàSerialPort
đọc sẽ ném nếu cổng được đóng. Tôi có thể kiểm tra xem ở trên cùng của hàm, hoặc tôi có thể để_port.Write()
nó ném. - Nếu có một loại ngoại lệ hoàn toàn mới ném khi
successfulSet
làfalse
? NếusuccessfulSet
làfalse
, không có gì mà lớp này có thể làm. Nên có một số loạiSetOperatingModeFailedException
ngoại lệ để phân biệt giữa cổng COM bị lỗi hoặc thiết bị bị lỗi? Có vẻ khá tốn thời gian để tạo ra một lớp ngoại lệ chỉ cho một điểm này.