Matthias Hembrock
Grünschnabel
Hallo zusammen,
vorweg ich hab das Programm einmal in c++ und einmal in c# geschrieben!
Ich habe eine Anwendung für die ich 2 Serielle Schnittstellen an einem PC benötige. Das Board des PC’s besitzt allerdings nur einen COM Port. Es lässt sich auf dem Board auch leider keine weitere Schnittstelle stecken. Also habe ich eine PCI Karte der Firma Digitus (DS 33001) besorgt.
Die Serielle Schnittstelle soll mit einer Externen Hardware über einen LIN Bus Kommunizieren. Die Umsetzung von RS232 auf Lin verfolgt durch einen entsprechenden Pegelwander. Das Protokoll ist an dem des Lin-Busses angelehnt und liegt mir vor.
Laut diesem Protokoll gibt es einen Master ( das an den PC angeschlossenen Gerät ) dieser sendet einen Identifier auf diesen antwortet dann z.B. der PC.
z.B.
Master: 0x00
0xCA
PC: 0x00
0x80
0xB4
Im wenn der PC keine Datensendet wird vom Master eine 10 Byte Lange Nachricht Versand in der der aktuelle Status den Slaves Mitgeteilt wird. Nach den letzten zwei Bytes darf der PC eine drei Byte lange Nachricht an den Master senden.
Die Kommunikation erfolgt mit einer Baudrate von 19200 Baud. Für eine 10 Byte lange Nachricht werden ca 10ms benötigt. Der PC muss also die Nachricht empfangen und auf diese Antworten in weniger als 10ms! Der Master wartet nicht auf die Salves. Wird das Timing nicht korrekt eingehalten so werden die gesendeten Befehle verworfen.
Nun zum Problem:
Ich habe eine C# Anwendung geschrieben(.net 3.5). Hier bin ich mit einer „Ereignis gesteuerten Schnittstelle“ schnell zu Ergebnissen mit der Onboard-Schnittstelle gekommen. Hierzu habe ich den „System.Io.Ports namespace“ in mein Projekt eingebunden.
Nach der Installation der PCI Karte und einem Neustart des Rechners funktioniert die Kommunikation über die Onboard schnittstelle nicht mehr. Aus einer Aufzeichung der Komunikation mit der Software "Portmon" entnehme ich, dass die Daten nicht korrekt oder zu langsam gesendet werden, da die Antwort vom angeschlossenen Device nicht korrekt verarbeitet werden.
Hier ein Trace vor der Treiber Installation:
read: Length 10: 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
Ein regelmäßiges Muster. Auf jede Nachricht erfolgt eine Antwort
und nach der Treiber installation:
read: Length 11: 00 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 C4 00 80 9D 01 00 E0 00 CA
read: Length 10: 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 C4 00 80 9D 01 00 E0 00 CA
read: Length 10: 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 12: 00 80 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 10: 00 00 00 80 9D 01 00 E0 00 CA
wie unschwer zu erkennen ist stimmen die beiden Aufzeichnunen nicht überein.
Ich habe vorher bereits eine andere Serielle Karte aus dem Hause Digitus (DS33040) eingebaut. Hier gab es aber weit aus größere Probleme anstelle von:
read: 00 11 00 80 62 00 00 1D 00 CA
habe ich mit der DS 33040
read: 00 28 FC 00 08 4C 16 10 A0 7C000 A6 FF
empfangen.
An welcher Stelle soll ich nach den Problemen suchen? Eigentlich sollen sich die PCI Karten doch genauso so verhalten wie die Onborad schnittstellen des PCs.
Die Programme sind in Visual C# 2008 mit dem .net Framework 3.5 auf einem Windows XP Rechner erstellt worden.
Um auszuschließen das es am .net Framework liegt habe ich das gesamte Programm noch einmal in c++ als Win32-dll nachgebildet. Hier wird die Serielle Schnittstelle mit ReadFile aus der WinBase.h angesteuert.
Falls es hift kann ich an dieser stelle auch noch den Code Posten!
Mit freundlichen Grüßen
Matthias Hembrock
vorweg ich hab das Programm einmal in c++ und einmal in c# geschrieben!
Ich habe eine Anwendung für die ich 2 Serielle Schnittstellen an einem PC benötige. Das Board des PC’s besitzt allerdings nur einen COM Port. Es lässt sich auf dem Board auch leider keine weitere Schnittstelle stecken. Also habe ich eine PCI Karte der Firma Digitus (DS 33001) besorgt.
Die Serielle Schnittstelle soll mit einer Externen Hardware über einen LIN Bus Kommunizieren. Die Umsetzung von RS232 auf Lin verfolgt durch einen entsprechenden Pegelwander. Das Protokoll ist an dem des Lin-Busses angelehnt und liegt mir vor.
Laut diesem Protokoll gibt es einen Master ( das an den PC angeschlossenen Gerät ) dieser sendet einen Identifier auf diesen antwortet dann z.B. der PC.
z.B.
Master: 0x00
0xCA
PC: 0x00
0x80
0xB4
Im wenn der PC keine Datensendet wird vom Master eine 10 Byte Lange Nachricht Versand in der der aktuelle Status den Slaves Mitgeteilt wird. Nach den letzten zwei Bytes darf der PC eine drei Byte lange Nachricht an den Master senden.
Die Kommunikation erfolgt mit einer Baudrate von 19200 Baud. Für eine 10 Byte lange Nachricht werden ca 10ms benötigt. Der PC muss also die Nachricht empfangen und auf diese Antworten in weniger als 10ms! Der Master wartet nicht auf die Salves. Wird das Timing nicht korrekt eingehalten so werden die gesendeten Befehle verworfen.
Nun zum Problem:
Ich habe eine C# Anwendung geschrieben(.net 3.5). Hier bin ich mit einer „Ereignis gesteuerten Schnittstelle“ schnell zu Ergebnissen mit der Onboard-Schnittstelle gekommen. Hierzu habe ich den „System.Io.Ports namespace“ in mein Projekt eingebunden.
Nach der Installation der PCI Karte und einem Neustart des Rechners funktioniert die Kommunikation über die Onboard schnittstelle nicht mehr. Aus einer Aufzeichung der Komunikation mit der Software "Portmon" entnehme ich, dass die Daten nicht korrekt oder zu langsam gesendet werden, da die Antwort vom angeschlossenen Device nicht korrekt verarbeitet werden.
Hier ein Trace vor der Treiber Installation:
read: Length 10: 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 13: 00 80 B4 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
Ein regelmäßiges Muster. Auf jede Nachricht erfolgt eine Antwort
und nach der Treiber installation:
read: Length 11: 00 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 C4 00 80 9D 01 00 E0 00 CA
read: Length 10: 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 C4 00 80 9D 01 00 E0 00 CA
read: Length 10: 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 12: 00 80 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 11: 00 00 11 00 80 9D 01 00 E0 00 CA
write: Length 3: 00 80 B4
read: Length 10: 00 00 00 80 9D 01 00 E0 00 CA
wie unschwer zu erkennen ist stimmen die beiden Aufzeichnunen nicht überein.
Ich habe vorher bereits eine andere Serielle Karte aus dem Hause Digitus (DS33040) eingebaut. Hier gab es aber weit aus größere Probleme anstelle von:
read: 00 11 00 80 62 00 00 1D 00 CA
habe ich mit der DS 33040
read: 00 28 FC 00 08 4C 16 10 A0 7C000 A6 FF
empfangen.
An welcher Stelle soll ich nach den Problemen suchen? Eigentlich sollen sich die PCI Karten doch genauso so verhalten wie die Onborad schnittstellen des PCs.
Die Programme sind in Visual C# 2008 mit dem .net Framework 3.5 auf einem Windows XP Rechner erstellt worden.
Um auszuschließen das es am .net Framework liegt habe ich das gesamte Programm noch einmal in c++ als Win32-dll nachgebildet. Hier wird die Serielle Schnittstelle mit ReadFile aus der WinBase.h angesteuert.
Falls es hift kann ich an dieser stelle auch noch den Code Posten!
Mit freundlichen Grüßen
Matthias Hembrock