Forum: Projekte & Code Sniffer für serielle und parallele Schnittstellen


von Erwin M. (nobodyy)


Lesenswert?

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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.