仮想COMだからかな?
今までCOMポートを使うアプリはC++でしか作っていなくて、初めてSerialPortクラス(System.IO.Ports)に触ってみたわけですが(・∀・)
ん?、SerialPort.Read*()ってSerialPort.BytesToReadが0の時に呼び出すと例外が発生する(゚ー゚*)?
Read*()メソッドを呼び出した時点では例外は発生しないけど、最初の1バイトを受信したタイミングでIOException「スレッドの終了またはアプリケーションの要求によって、I/O 操作が中止されました。」とか言われてしまい(´・ω・`)
ただこれだけのテストコードで動作確認しただけなんですが(´Д`;)
using( SerialPort comPort = new SerialPort( "COM5", 9600, Parity.None, 8, StopBits.One ) ) { try { comPort.Open(); do { try { // ↓を有効にすると例外は発生しない //if ( comPort.BytesToRead > 0 ) { int read = comPort.ReadByte(); ... } } catch( IOException ex) { ... } } while( true ); } finally { comPort.Close(); } }
これで例外が発生しちゃうと、同期でデータをWaitForする使い方が出来ない気がするけど……とか思っていたら、ひょっとして仮想COMを使って実験しているのが悪いのかしら(*゚ー゚)?
http://mixw.net/related.htm#tncemu
こいつを使って、クロス接続された仮想COM5とCOM6を作って実験していたんですが。
C++で使っていたときには問題に気がつかなかったんですけど、VMWareのCOMポートとしてもうまく使えないみたい(?)だし、非同期I/Oに対応してないんじゃないかって話もありますけれど(´Д`)
とりあえず手元に仮想じゃないクロスケーブルだとか適当なCOM通信デバイスが無いので、ちゃんとした確認はまた後で(´ω`)