Weil ich zum Sniffen (Loggen, Aufzeichnen) von seriellen Schnittstellen
nichts zufriedenstellendes fand, habe mal selber etwas für Linux
gemacht, das nun auch von parallelen Schnittstellen aufzeichnen kann:
http://true-random.com/homepage/projects/logger/index.html
Am wichtigsten dabei ist mir das Defragementieren: Serielle Daten die
zusammengehören werden anhand der Zeitdifferenz erkannt, zusammengefügt
und erst nach einem Timeout ausgegeben. Während einer nicht
abgeschlosssenen Defragmentierung werden die Daten anderer
Schnittstellen zurückgehalten, damit sie in der richtigen Reihenfolge im
Logfile landen.
Damit sind die Daten im Logfile so wie man sie auch im Oszilloskop oder
Logikanalysator sieht. Andere Sniffing-Programme wie Jpnevulator und
auch teure propietäre wie Docklight haben ja den Bug das sie das nicht
machen und die Daten so zerhacktstückt ausgeben, wie sie von der
einlesenden Funktion kommen. Zudem gibt kaum eines von ihnen den Status
der Status-Pins aus, obwohl das häufig wichtig ist, selbst wenn die
nicht für die serielle Schnittstelle genutzt werden, denn man möchte ja
auch Signale wie z. B. ein 0°-Signal von einem Resolver einzulesen,
damit man im Logfile auch sieht was sich sonst so bei den Maschinen tut.
Für das korrekte Funktionieren war es nötig die Select-Funktion auf nur
je einen UART anzuwenden, denn bei gleichzeitig eingehenden Daten stimmt
die Byte-Reihenfolge nicht; das ist ein bekannter Bug der z. B. zum
Programm Jpnevulator beschrieben ist. Deshalb habe ich nicht dieses
Programm ausgebaut sondern ein ganz neues gemacht mit Posix-Threads:
1 | 1. Ein Main-Thread, die Main-Funktion, die weitere Threads startet
|
2 | und deren Ausgaben zeitlich geordnet sowie gefiltert in eine
|
3 | Log-Datei schreibt.
|
4 |
|
5 | 2. X Threads die eingehende Daten von je einer seriellen
|
6 | Schnittstelle (UART) lesen und zusammen mit deren Ankunftszeit
|
7 | in einen Ringpuffer schreiben.
|
8 | Das Einlesen erfolgt interruptgesteuert.
|
9 |
|
10 | 3. Y Threads die eingehende Daten von den (bis zu) vier Eingangs-
|
11 | Pins je einer seriellen Schnittstelle lesen und zusammen mit
|
12 | der aktuellen Zeit in einen Ringpuffer schreiben. Hierbei
|
13 | werdeb neben dem aktuellen Zustand auch Flanken gespeichert.
|
14 | Für die Ausgabe in die Log-Datei kann ein Filter gesetzt
|
15 | werden auf Pegel oder Flanken.
|
16 | Das Einlesen erfolgt per Polling.
|
17 |
|
18 | 3. Z Threads die eingehende Daten von den 13 Eingangs-
|
19 | Pins je einer parallelen Schnittstelle lesen und zusammen mit
|
20 | der aktuellen Zeit in einen Ringpuffer schreiben. Hierbei
|
21 | werden neben dem aktuellen Zustand auch Flanken gespeichert.
|
22 | Für die Ausgabe in die Log-Datei kann ein Filter gesetzt
|
23 | werden auf Pegel oder Flanken.
|
24 | Das Einlesen erfolgt per Polling.
|
25 |
|
26 | 4. Ein Timing-Thread, der den per Polling einlesenden Threads
|
27 | alle M Mikrosekunden ein Signal schickt, damit sie gleichzeitig
|
28 | die parallelen Daten einlesen.
|