2009-05-04 3 views
1

Ich debugge etwas Mono-Code, der die serielle Schnittstelle verwendet. An einem gewissen Punkt der mono schreiben eine Tabelle mit dem folgenden Code:Mono System.IO.Ports SerialPort-Klasse Fehlerbehandlung

// 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 eine Serialport-Instanz ist. Wenn ich diesen Code mit strace jedoch verfolgen, hier ist was ich denke, ist die resultierenden Systemaufrufe:

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) 

Mein Verständnis ist, dass die Serialport-Write-Methode des -EAGAIN Fall nicht richtig handhabt DOS und aktualisiert den Index von - 1 vor dem Neustart des Schreibens. Denn nach jedem Versuch wird der Inhalt des ursprünglichen Puffers um ein Byte verschoben.

Meine Frage ist, ist es ein bekanntes Problem, und wie kann ich die SerialPort-Klasse ändern, so dass es sich richtig verhält oder die serielle Schnittstelle auf eine blockierende Weise verwenden?

Die Mono documentation for the SerialPort class ist nicht sehr hilfreich

Zusätzliche Informationen: mono -V Ausgang:

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 

Antwort

2

In Betracht ziehen, auf eine neuere Version zu aktualisieren.

Der Fehler wurde behoben here.

+0

Es hat es nicht in 1.9.1 geschafft, was zumindest bei Debian und Freunden weit verbreitet scheint. – shodanex

0

ich eine Abhilfe, aber ich halte es nicht für eine gute Lösung:

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.");