SerialPort Daten-Verlust - C#
Arbeite ich an einem SerialPort-app und ein sehr einfaches Teil ist, dass Sie mir Probleme. Ich möchte einfach Lesen, ein konstanter Strom von Daten aus dem port und schreiben Sie es auf, um eine binäre Datei, wie es kommt in. Das problem scheint zu sein, Geschwindigkeit: mein code hat geklappt, auf meine 9600 baud-test-Gerät, aber wenn auf die 115200bps live-Gerät habe ich scheinen zu sein, Daten zu verlieren. Was passiert ist, dass nach einem Variablen Zeitraum von Zeit, ich vermisse 1 byte, die Würfe aus, um den rest der Daten. Ich habe versucht, ein paar Dinge:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bwLogger.Write((byte)serialPort1.ReadByte());
}
oder
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] inc = new byte[serialPort1.BytesToRead];
serialPort1.Read(inc, 0, inc.Length);
bwLogger.Write(inc);
}
und ein paar Variationen. Ich kann nicht mit ReadLine() wie arbeite ich mit einem Konstanten Strom von Daten (richtig?). Ich habe versucht, das hantieren mit der buffer size (beide serialPort1.ReadBufferSize und die hardware FIFO-buffer). Ideal für usability-Zwecke würd ich Griff dies auf der software-Seite und nicht die Benutzer ändern, Windows-Treiber-Einstellungen.
Irgendwelche Ideen?
Dies ist eine hervorragende Beratung. Aufgrund der einzigartigen Funktion der mein spezielles Gerät, ich habe die Fähigkeit, zu Linear interpolieren die Daten ausfüllen, fehlende oder anderweitig "schlecht" - Pakete. In den meisten Kommunikationssituationen, die den Umgang mit dieser Art von Veranstaltung sollten die meisten auf jeden Fall robuster ist von entwickelt gegen ein richtiges Protokoll, wie Sie bereits erwähnt. Gute Ratschläge für jemanden arbeiten, die in jeder form von Kommunikation.
Ich entschuldige mich. Nach re-Lektüre, dass ich verstehe, dass Sie bezogen auf harte Echtzeit-Anforderungen und fehlende Mittel fehlen eine Menge Daten, die nie wieder kommen. Finden Sie eine bevorstehende Antwort von mir bezüglich threading. Obwohl Sie bereits akzeptiert die Antwort, es könnte sein, lohnt ein Blick in.
InformationsquelleAutor Slim | 2009-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, die Aktivierung handshaking mit dem Handshake-Eigenschaft des SerialPort-Objekt.
Werden Sie haben, um es sowohl auf der sender-oder Empfänger. allerdings: wenn Sie, dass die Empfänger den UART-Puffer (sehr klein, 16 Byte IIRC), es gibt wohl keinen anderen Weg. Wenn Sie nicht aktivieren das handshaking auf dem sender, werden Sie wahrscheinlich haben, um zu bleiben 9600 oder unten.
Hoffe, es klappt. 🙂
InformationsquelleAutor XXXXX
Wenn das problem scheint zu sein, dass kann man nicht verarbeiten, die die Daten schnell genug, was Sie versuchen könnte, wäre die Doppel-Puffer Ihre Daten.
1) Erlauben, einen thread zu Lesen der seriellen Schnittstelle in einen Puffer. Dies kann auch beinhalten, das kopieren von Daten aus dem port in den Puffer (ich bin nicht sehr vertraut mit .NET).
2) Wenn Sie bereit sind zu handhaben, die eingehende Daten (in einem anderen thread) machen Ihr Programm Lesen Sie in der 2. Puffer, und während dies geschieht, sollten Sie schreiben Sie den ersten Puffer auf die Festplatte.
3), Wenn der erste Puffer auf die Festplatte geschrieben wird, tauschen Sie es zurück an den seriellen port-Puffer und schreiben den 2. Puffer auf die Festplatte. Wiederholen Sie den Vorgang, ständig tauschen der Puffer.
InformationsquelleAutor San Jacinto
Ich würde Folgendes versuchen:
Ich bin mir nicht sicher, ob dies helfen könnte, aber es sollte zumindest den Druck des Rahmens auf das Ereignis auslösen, oft.
InformationsquelleAutor Bobby
Ich würde prüfen, ob die Anzahl der gelesenen bytes wird zurückgegeben, indem die Read(Byte>[], Int32, Int32) - Methode, und stellen Sie sicher, es passt, was Sie erwarten.
Stellen Sie sicher, Sie sind empfangsbereit für SerialErrorReceivedEventHandler ErrorReceived Ereignisse auf das port-Objekt. Ein RXOver Fehler hinweisen würde dein Puffer voll ist.
Überprüfen Sie die thread-Sicherheit auf den output-Puffer. Wenn das schreiben auf den Ausgabe-Puffer ist nicht thread-sicher, eine zweite schreiben kann beschädigt die ersten schreiben.
InformationsquelleAutor Liam
Ist Ihre bwLogger ein BinaryWriter-Klasse? Können Sie versuchen, es mit einem BufferedStream, um die disk-I/O nonblocking.
Auch, wenn Sie Ihre Pakete haben eine bekannte endbuchstaben, können Sie die SerialPort.NewLine Eigenschaft aktivieren, die Sie für die Verwendung mit ReadLine/WriteLine, obwohl ich nicht glaube, das würde viel von einem performance-Unterschied.
InformationsquelleAutor mtrw
Den Maschinen arbeite ich mit vor kurzem alle senden ein Stopp-code (in meinem Fall der ASCII-code 3 oder 4). Wenn Sie auch über diese Funktion verfügen, können Sie Gebrauch machen von
ReadTo(string)
aus deiner SerialPort-Objekt.InformationsquelleAutor Austin Salonen