Frage

Ich bin Debuggen einige Mono-Code, der die serielle Schnittstelle verwendet. An einem gewissen Punkt, schreiben die mono eine Tabelle mit dem folgenden Code:

   // 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 ist eine Serialport-Instanz. Wenn ich diesen Code mit strace verfolgen jedoch hier ist, was ich denke, das resultierende System sind Anrufe:

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 nicht behandeln dos den -EAGAIN Fall korrekt und aktualisiert den Index von -1 vor der Schreib neu zu starten. denn nach jedem versucht, 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, damit es über die serielle Schnittstelle in einer blockierenden Art und Weise richtig oder verwenden Sie verhält?

Die Mono-Dokumentation die Serialport-Klasse nicht sehr hilfreich ist

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
War es hilfreich?

Lösung

Betrachten Sie auf eine neuere Version zu aktualisieren.

wurde der Fehler behoben hier .

Andere Tipps

Ich habe ein Problem zu umgehen, aber ich glaube nicht, es ist 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.");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top