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
Es hat es nicht in 1.9.1 geschafft, was zumindest bei Debian und Freunden weit verbreitet scheint. – shodanex