So-net無料ブログ作成
検索選択

.NETのSerialPortクラスでハマったこと [仕事とプログラムのハナシ]

.NET Framework (3.5) のSerialPortクラスでハマったことをメモ。
※個々の現象は、ググると詳細な情報(ブログや掲示板)が出てくるので、まとめだけ。

■BeginInvokeでスレッド使っているとき、ポートをCloseしたあとにアプリが落ちる。
 例外発生してるんだけど捕まえづらい。

■データ受信時に、バッファへの書き込み(Windows側が行う)とバッファからの読み出し(自分の書いたプログラムが行う)が運悪く競合すると、受信したはずのデータが読めなくなる。
 そのあとに追加で受信すると、読めなくなったデータが読めるが、追加分が読めない。
 ByteToReadだっけ?の分だけ読めば発生しづらいけど、100%の回避策にはならない。

■USB-232C変換(俗にいうUSBシリアル)のポートをSerialPortクラスでOpenした状態でUSBシリアル(USB側)を引っこ抜くとアプリが落ちる。
 例外発生してて、捕まえられるんだけど、ガーベージコレクションあたりがダメっぽくて、それだけじゃ対処できない。
 キャッチしてから無視すると、その場はokだけど、そのアプリで再度SerialPortクラスを使ったときに落ちる。

■StopBitsプロパティにNoneが設定できない。
 enumに列挙されてるクセに、設定しようとすると範囲外だって例外がスローされる。

■StopBitsプロパティの1.5bitが使えない。
 これは設定できる。けど、使えない。
 クラスじゃなくてWindows標準ドライバの問題っぽい。
 →別のドライバがあれば使えそうな気がするけど、未検証。

■受信イベントの発生タイミングが信用できない。
 『受信したときに発生する』んであって『バッファにデータがあるか』じゃない、ってところまではいい。
 空っぽの状態で受信したのにイベントメソッドに飛ばないってのはどーいうことだ。

■フロー制御が使えない。
 ハードフローがRTSのみってのはどーいうことだ。
 他のピンはどーなってんだ。

■COMポート番号の列挙は簡単だけど、フレンドリーネームの取得がかったるい。
 どっちも取得できれば便利なのに。

こんなもんかなー?
思い出したら追記しようっと。


私の「先生」いわく、CreateFileを使ったほうがいい、だそうな。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。