2009-05-04 2 views
1

シリアルポートを使用している一部のモノコードをデバッグしています。 は、ある時点でモノ次のコードでテーブルを書き込む:Mono System.IO.Ports SerialPortクラスのエラー処理

// Send the 1024 byte (256 word) CRC table 

    progressBar = new ProgressBar(); 

    progressBar.Update(0.0,"Sending CRC table..."); 

    for (int i = 0; i < MyCRC.Length; i++) 

    { 

     MySP.Write(MyCRC[i].ToString("x8")); 

     progressBar.Percent = (((Double)(i+1))/MyCRC.Length); 

    } 

    progressBar.Update(100.0,"CRC table sent."); 

MySPがSERIALPORTインスタンスです。私はしかし、straceのを使用してこのコードをトレースすると 、ここで私は結果のシステムコールをしていると思うものです:

16620 write(3, "3ab551ce", 8)   = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0003ab551c", 8)  = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0\0003ab551", 8)  = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0\0\0003ab55", 8)  = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\10\0\0\0003ab5", 8) = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0\10\0\0\0003ab", 8) = -1 EAGAIN (Resource temporarily unavailable) 

... 

16620 write(3, "\0005\0\230O+\10\0", 8) = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "E\0005\0\230O+\10", 8) = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0E\0005\0\230O+", 8) = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0\0E\0005\0\230O", 8) = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "\0\0\0E\0005\0\230", 8) = -1 EAGAIN (Resource temporarily unavailable) 
16620 write(3, "4\0\0\0E\0005\0", 8) = 8 
16620 write(3, "\230O+\10\0\0\0\0", 8) = 8 
16620 write(3, "\0\0\0\0\10\0\0\0", 8) = -1 EAGAIN (Resource temporarily unavailable) 

私の理解では、SERIALPORTのWriteメソッドが正しく-EAGAINケースを処理できないDOSとによってインデックスを更新していることです - 1に設定してください。各試行の後、元のバッファの内容が1バイトだけシフトされるからです。

私の質問は、既知の問題ですか?SerialPortクラスが正しく動作するように、またはシリアルポートをブロック方式で使用するために、どのように変更できますか?

Mono documentation for the SerialPort classは非常に有用ではありません

追加情報:モノラル-V出力:

Mono JIT compiler version 1.2.6 (tarball) 
Copyright (C) 2002-2007 Novell, Inc and Contributors. www.mono-project.com 
    TLS:   __thread 
    GC:   Included Boehm (with typed GC) 
    SIGSEGV:  altstack 
    Notifications: epoll 
    Architecture: x86 
    Disabled:  none 

答えて

2

新しいバージョンにアップグレードすることを検討してください。

バグはhereと修正されました。

+0

それは1.9.1になっていませんでした。これは、少なくともDebianや友人には広く使われているようです。 – shodanex

0

私は回避策がありますが、私はそれが良い解決策では考えていない:

progressBar = new ProgressBar(); 

progressBar.Update(0.0,"Sending CRC table..."); 

for (int i = 0; i < MyCRC.Length; i++) 

{ 

    MySP.Write(MyCRC[i].ToString("x8")); 
    while(WySP.BytesToWrite != 0) 
    { 
     ; 
    } 
    progressBar.Percent = (((Double)(i+1))/MyCRC.Length); 

} 

progressBar.Update(100.0,"CRC table sent.");