Mono System.IO.Ports Serialport-Klasse Fehlerbehandlung
-
03-07-2019 - |
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
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.");