仮想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通信デバイスが無いので、ちゃんとした確認はまた後で(´ω`)