Was kann ich tun, um die Latenz dieser seriellen Schnittstellen zu verringern, die über einen Seriell-zu-USB-Adapter an einen PC angeschlossen sind?

8

Ich glaube, ich habe versehentlich in meinem Leben ein Bedürfnis nach eingebetteten Systemen entdeckt. Was toll ist! Und irgendwie beängstigend. Und ich brauche Hilfe.

Hintergrund : Ich wurde beauftragt, eine GUI-Anwendung zu erstellen, die Scans von zwei SICK LMS-291s aufnimmt und diese in ein GPS mit einer Genauigkeit von weniger als einem Zoll integriert, damit Sie wissen, wo jeder Scan stattgefunden hat. Als naiver Webprogrammierer habe ich verstanden, dass das Timing wichtig sein würde, wusste aber nicht, dass es auch schwierig sein würde! Wenn Sie nicht wissen, wann jeder GPS-Punkt und jeder Scan stattgefunden hat, können Sie nicht herausfinden, wo die Scans stattfinden. Hoppla.

Sie hatten Windows 7 als Plattform angegeben und eine SeaLevel RS422-zu-USB- Box gekauft, um die Sensoren und das GPS anzuschließen , und in kurzer Zeit entdeckte ich meine Torheit. Irgendwo zwischen den Sensoren und meinem Computerprogramm verhinderte etwas, dass die Scans rechtzeitig eintrafen. Das LMS spuckt 75 Scans pro Sekunde oder mit 13,32 ms / Scan aus. Mein Programm bekommt sie nicht rechtzeitig. Sie werden alle 100 Millisekunden in Gruppen von 7 oder 8 oder 10 oder so etwas abgerufen. Manchmal werden auch nicht genügend Scans angezeigt oder sie werden verstümmelt. Entweder sendet dieser SeaPort-Adapter nur zehnmal pro Sekunde (ist das möglich? Ich weiß nicht, wie USB funktioniert) oder Windows überprüft den Puffer nicht fast oft genug (es muss irgendwo einen Puffer geben, oder?).

Gegenwärtiger Tag : Dies führt zu einigen Ungenauigkeiten, mit denen der Kunde grundsätzlich einverstanden ist. Ich bin es jedoch nicht und da ich die Möglichkeit habe, ähnliche Arbeiten für den Kunden auszuführen (mehr Sensoreingänge zu integrieren!), Würde ich gerne herausfinden, wie man es richtig macht, z. B. angesichts der Genauigkeit des GPS in der Lage sein, Garantien für die Präzision und Genauigkeit der Scanpositionen zu geben.

Wie sieht das aus? Ich benötige eine Benutzeroberfläche und kann alle 13,32 Millisekunden die Eingabe dieser drei Geräte überprüfen. Wenn ich FreeRTOS beispielsweise mit Nano-X für die GUI verwenden und auf einem von ihnen bereitgestellten Laptop ausführen würde, würde das nach einer vernünftigen Lösung klingen? Ist es möglich, dass der RS-422-zu-USB-Adapter diese Verzögerungen verursacht, und die Verwendung von Windows ist für diesen Zweck eigentlich in Ordnung?

canisrufus
quelle
2
Wen mussten Sie ermorden, um diese Laser-Entfernungsmesser zu bekommen, und hatte er einen Freund, der vielleicht auch welche hat?
Connor Wolf
@ ConnorWolf Hah! Ich wünschte, ich hätte sie besessen. Es ist für ag (Bestimmung des Erntevolumens), also waren sie bereit, nach Hardware zu suchen (Traktoren können 75.000 US-Dollar kosten ...), aber nicht bereit, nach Programmiertalenten zu suchen.
Canisrufus
Ich kenne die Puffergröße in Windows nicht, aber Sie möchten das auf jeden Fall überprüfen. Unter Linux sind diese Puffer 4 KB groß. Abhängig von den von Ihnen gesendeten Daten und den von Ihnen verwendeten Systemaufrufen empfängt ein Programm möglicherweise nur 4 KB Datenblöcke. Wenn dies das Problem ist, möchten Sie sorgfältig prüfen, mit welchen Systemaufrufen Sie aus den Puffern lesen.
Jippie
1
Ich schlage vor, Sie möchten eine direkte serielle Verbindung herstellen - Sie können serielle Anschlusskarten für PCs und Laptops erwerben (beachten Sie auch, dass die meisten Hardbooks von Panasonic standardmäßig noch serielle Anschlüsse haben). Dadurch werden Pufferprobleme in der USB-seriellen Schnittstelle vermieden. Windows 7 verfügt über ausreichend Echtzeitfunktionen, sodass Sie dies wahrscheinlich nicht ändern müssen.
ConcernedOfTunbridgeWells
Nur ein Kommentar: Der Titel ist lustig, hilft aber nicht viel, den Inhalt der Frage herauszufinden: Könnten Sie ihn klarstellen?
Clabacchio

Antworten:

6

Das Problem liegt mit ziemlicher Sicherheit in der USB-Pufferung des USB-RS422-Konverters. USB hat eine variable und ziemlich hohe Latenz.

Die einfachste Lösung wäre einfach eine bessere RS422-Schnittstelle, idealerweise etwas PCI / PCI-e-basiertes. Das würde die Latenzprobleme lösen.

Möglicherweise können Sie auch die USB-Abfragerate ändern, obwohl dies ziemlich stark vom Host-Betriebssystem abhängt (auf welcher Plattform befinden Sie sich?).


Für das, was es wert ist, habe ich mich auf der Website des Sealevel-Systems umgesehen und es ist MASSIV mit Marketing-Bullshit infiziert. Sie geben buchstäblich 10 Seiten und mehrere Whitepaper aus, um zu sagen: "Wir verwenden intern einen USB-Hub, anstatt MCU-Multiplexing durchzuführen."

Hey SeaLevel! Das ist es auch, was die billige 4-Port-USB-Serial-Schnittstelle für 50 US-Dollar, die ich bei e-bay aus China gekauft habe, macht! Du bist nichts Besonderes, selbst wenn du ein halbes Dutzend vapide Whitepapers schreibst, die versuchen, es so klingen zu lassen, wie du bist!

Haben Sie versucht, diese Dinge zur Verwendung von FTDI-Treibern zu zwingen? Ich würde Geld dafür investieren, sie verwenden nur FTDI FT232 oder ähnliches nach Moorstandard. Können Sie die Schachtel auf einer von ihnen öffnen und Fotos machen?


Wenn Sie wirklich Ihre eigene Hardware drehen möchten, um Spaß zu haben oder sich weiterzubilden, würde ich Ihnen dringend empfehlen, nicht zu versuchen, alles in der Hardware zu tun. Da Sie einfach alle drei Signale zeitkorrelieren müssen, ist alles, was Sie wirklich brauchen, etwas, das auf drei seriellen Leitungen (zwei RS422, ein RS232 (das GPS)) lauschen, die Daten mit einem Zeitstempel versehen und an den Hauptcomputer weiterleiten kann .

Sobald die Daten mit einem Zeitstempel versehen sind, können Sie die gewünschte Pufferlatenz haben, da Sie immer nur die Zeitstempel anzeigen können.

Wenn Sie keine Hardware-Basis haben, ist es realistisch gesehen ein ziemliches Unterfangen, etwas zu entwerfen, das ausreicht, um eine schöne Benutzeroberfläche zu zeichnen.

Persönlich würde ich wahrscheinlich eine ziemlich klobige ARM-MCU auf das Pufferproblem werfen und damit fertig sein. Trotz der Tatsache, dass es sich um ein Arduino handelt, verfügt das Arduino Due über reichlich SRAM und ist mehr als schnell genug für das, was Sie benötigen (und es gibt viel Unterstützung, was immer schön ist).
Alternativ hat die STM32-Serie eine ähnliche Leistung und ist eher für "fortgeschrittene" Benutzer gedacht (lesen Sie, es gibt weniger oder keine Beispiele, auf die verwiesen werden kann). ST stellt auch viele sehr schöne, extrem preiswerte Evaluierungsbretter her .

Mit dem Due erhalten Sie einen nativen USB-Anschluss, für den Sie Ihren eigenen CDC-Treiber rollen können, wenn Sie möchten. Einige der STM32-Karten verfügen auch über natives USB.

Connor Wolf
quelle
In Bezug auf das Betriebssystem: Ich verwende derzeit Windows 7 auf einem Single-Core-Tablet. Ich kann auch einen Laptop benutzen und installieren, was ich will.
Canisrufus
7
Ich würde auch einen Mikrocontroller für die Korrelation der Daten verwenden und ihn dann zu Anzeigezwecken an eine Windows-Box weiterleiten. +1
JustJeff
1
Die Karte, die Sie verlinken, würde wahrscheinlich funktionieren, obwohl ich nicht sicher bin, ob ich ihnen vertrauen würde, da SeaLevel anderswo voller Scheiße zu sein scheint. Für was es wert ist , sie tun zu erwähnen , dass die PCI-E - Karte ein nutzt 16C954Hardware-Quad uart IC (vermutlich gibt es zwei von ihnen auf der Karte).
Connor Wolf
1
Ich denke wirklich, die einzig richtige Lösung wäre, sie anzurufen und nur nach Latenzproblemen zu fragen. Es kann Dinge geben, die in ihrem Treiber eingestellt werden können!
Connor Wolf
2
+1 auf der STM32F4-Lösung; die STM32F4-Discovery - Board ist komischerweise unter -priced, hat bis zu 6 UARTs und ein USB - OTG FS - Port. Wenn Sie mit Embedded Design nicht vertraut sind, werden Sie es ziemlich schwierig finden, USB darauf laufen zu lassen. Am einfachsten ist es, sich mit einem FTDI-Kabel über einen UART anzuschließen. Die Coocox-IDE ist kostenlos, hat keine Einschränkungen hinsichtlich der Codegröße und unterstützt das Discovery-Board recht gut.
März
3

Wenn ich die Frage verstehe, kommt es darauf an, Zeit- / Ortsnachrichten von GPS über eine serielle Leitung zu empfangen und Entfernungsdatennachrichten zu korrelieren, die über andere serielle Leitungen empfangen wurden. Im Idealfall haben die Entfernungsmesser-Nachrichten einen eigenen Zeitstempel. Wenn Sie alle Uhren synchronisieren könnten, könnten Sie den Ort bestimmen, an dem der Bereich erfasst wurde, durch Interpolation des Bereichszeitstempels zwischen den beiden GPS-Nachrichten mit dem festlegen am besten passende Zeitstempel. Aber das hast du natürlich nicht.

Es kommen einige Lösungen in den Sinn, bei denen ein Mikrocontroller verwendet wird, um die Echtzeit-Datenkorrelation durchzuführen, und dessen Ausgabe zu Anzeigezwecken in die PPC gepumpt wird. Grundsätzlich ist der Mikrocontroller da, um die engen Timing-Probleme zu lösen.

Für eine einfachere Lösung benötigen Sie lediglich eine Möglichkeit, alle Nachrichten aus den verschiedenen seriellen Leitungen zu sammeln und in der Reihenfolge ihres Eingangs zu einem einzigen Stream zu kombinieren und in den PC zu pumpen. Sie können daraus schließen, dass zwischen diesen beiden Nachrichten irgendwann eine Entfernungsmesser-Nachricht zwischen zwei GPS-Nachrichten aufgetreten ist.

Dies gibt Ihnen natürlich ein gewisses Maß an Unsicherheit, abhängig von der Häufigkeit der GPS-Nachrichten. Der Nachteil ist, dass Sie mit zunehmender Frequenz der GPS-Nachricht (um eine genauere Korrelation zu erhalten) die Anforderungen an den Mikrocontroller und an die serielle Verbindung zum PC erhöhen. Im Extremfall ist die serielle Verbindung mit GPS-Nachrichten gesättigt, in die gelegentlich eine Reichweitenmeldung eingeht. Offensichtlich werden die meisten dieser GPS-Nachrichten nicht benötigt. Der Vorteil dieser Lösung ist jedoch, dass das Mikro vom Standpunkt der Software aus sehr wenig zu tun hat. Sie können alles in einer einfachen Schleife der Assemblersprache erledigen, ohne dass ein Betriebssystem erforderlich ist.

Für eine komplexere Lösung können Sie eine lokale Uhr im Mikro bilden und das GPS verwenden, um diese Uhr zu synchronisieren , sodass Sie, wenn Sie eine Entfernungsmeldung erhalten, einen Zeitstempel mit der Uhr des Mikros erhalten können. Wenn Sie ein Mikro mit einer Kristall-Zeitbasis verwenden, könnten Sie wahrscheinlich mit 1-Hz-GPS-Nachrichten auskommen und trotzdem viel besser als Millisekunden-Genauigkeitszeiten sein, die auf den Entfernungsnachrichten angegeben sind. Eine kompetente Person für eingebettete Systeme könnte diese wahrscheinlich auch im Assembler auf einem Mikro am unteren Ende durchziehen, aber Sie haben erwähnt, dass Sie gerade erst anfangen. Sie könnten sich ein leistungsfähigeres Mikro ansehen, das Linux ausführen kann, und wahrscheinlich eine bereits vorhandene Lösung für die Synchronisierung der Linux-Uhr mit dem GPS finden.

JustJeff
quelle
Einfacher als das Erstellen einer Echtzeituhr in der MCU und das Synchronisieren mit GPS ist es, einfach eine der Timer- / Zählerperipheriegeräte zu verwenden, um die Anzahl der Zyklen zwischen GPS-Nachricht und Entfernungsmesser-Nachricht zu messen und diese Delta-Zeit-Informationen hinzuzufügen der Datenstrom.
Ben Voigt
3

Was ich wahrscheinlich tun würde, ist, die seriellen Daten mit einer höheren Rate in einem neuen seriellen Datenstrom mit einer statischen Verschachtelung zu multiplexen. Führen Sie dann den Datenstrom über USB-UART zum Computer. Auf diese Weise wissen Sie, dass das erste Byte von Gerät 1 stammt, das zweite Byte von Gerät 2, das dritte Byte von Gerät 3 und in diesem Fall ein viertes Byte als CRC oder Sequenznummer. Geben Sie ein paar Bytes am Anfang der Frame-Markierung ein, um den Datenstrom zu synchronisieren, und füllen Sie die Bytes auf, wenn keine Daten verfügbar sind und Sie fertig sind. Möglicherweise kennen Sie die absolute Zeit nicht, aber Sie wissen, dass die relative Zeit zwischen den verschiedenen Datenblöcken liegt.

Jippie
quelle
1

Ich würde auch einen Mikrocontroller verwenden, um die RS-Daten zu empfangen, sie mit einem Zeitstempel zu versehen und an den PC weiterzuleiten. Mit einem Windows-PC können Sie keine kritische Arbeit für das E / A-Timing ausführen (außer vielleicht mit einer Soundkarte), da sich die Software und die Treiber ständig ändern, wenn die Treiber hinter Ihrem Rücken aktualisiert werden.

Aber das erste, was ich tun würde, ist, einen USB-Logikanalysator zu kaufen. Sie können einen für weniger als 100 USD kaufen, einige Nachrichten vom GPS-Empfänger abrufen und genau überprüfen, wann jedes Byte empfangen wird. Verwenden Sie diese Informationen, um zu testen / genau zu berechnen, wie genau das Timing der Daten überhaupt ist: z. B. genau, was und wann die GPS-Box sendet. Dann können Sie herausfinden, welche Genauigkeit erreichbar ist und wie viel Aufwand Sie bereit wären, um ein bestimmtes Maß an Genauigkeit zu erreichen.

Geben Sie hier die Bildbeschreibung ein

Oben ein Bild eines (Saleae?) USB-Logikanalysators.


[Bearbeiten] Haha, die Verwendung der Soundkarte könnte eine lustige Art sein, damit sie tatsächlich funktioniert. Sie können die UART-Daten (über einige Widerstände und Kondensatoren) mit dem Soundkarteneingang verbinden und Software schreiben, um jede Flanke im seriellen Stream zu erkennen und so eine hervorragende Timing-Genauigkeit zu erzielen!. Ok, ich schlage das nicht wirklich ernsthaft vor, nur zum Lachen!

PkP
quelle