23.02.2010, 16:08
Das sind Fehler, wie sie typischerweise auftreten: Auf em Kabal get hat ab und zu mal ein Zeichen verlore.
Diese Fehler werden aber von VISA nicht abgefangen! Dafür wäre ein Treiber auf einer höheren Ebene zuständig. An dir liegt es nun, solche Fehler zu erkennen und möglicherweise zu beheben.
Erkennen ist einfach: Alles was nicht ins Format passt, ist ein fehlerhafter Datensatz. Und das Format ist eben festgelegt. Wenn du sagt, /n reicht, dann will ich dem zustimmen: Dann musst du deine Fehlerprüfung aber wie folgt machen: Lies mit VISA-Read den Puffer bis zum Endezeichen /n ein (das kann VISA, guckst du "Trennzeichen"). Jetzt musst du den String testen: vor /n muss eine Zahl im Format (z.B.) +##.## stehen. Du musst das so genau machen. Wie willst du sonst feststellen, dass der Punkt (siehe eines deiner Fehlerbeispiele) verloren gegangen ist? Vor diesem String muss dann ein ';' stehen usw.
Die Frage ist nun, was tun, wenn ein Fehler erkannt worden ist. Ohne ein entsprechend gutes Protokoll kannst du nur eins tun: den Datensatz ersatzlos verwerfen. Kaputte Daten kannst du ohne entsprechende Sicherung nicht reparieren. (In besonderen Fällen kann man anstelle des aktuellen, aber kaputten Datensatzen den vorhergehenden, aber ganzen Datensatz wiederholen als aktuell übernehmen.)
Was du eigenlich brauchst, ist ein fehlertolerantes Protokoll. Normalerweise würde man einen Datensatz mit mehreren Sicherheitsstufen verwenden: STX REP LEN <data> BCC ETX. Außerdem würde man die Datenpackete mit ACK respektive NAK quittieren. Ein solches Protokoll hat zwar den Vorteil, dass dir garantiert keine Datenpakete verloren gehen. Aber es macht halt viel Aufwand. Auf beiden Seiten der Datenübertragung. Wenn du dir diesen vielen Aufwand aber sparen willst, muss du damit Leben, dass ab und zu mal ein Datensatz fehlt.
Auf der anderen Seite: Normalerweise ist es eher unwahrscheinlich, dass ein Zeichen auf dem Kabel kaputt geht. Bei funktionsfähiger Hardware ist die Ausfallrate erfahrungsgemäß höchstens ein Promille. Wenn dir eins von zwanzig kaputt geht, stimtm was mit deiner Hardware nicht.
Diese Fehler werden aber von VISA nicht abgefangen! Dafür wäre ein Treiber auf einer höheren Ebene zuständig. An dir liegt es nun, solche Fehler zu erkennen und möglicherweise zu beheben.
Erkennen ist einfach: Alles was nicht ins Format passt, ist ein fehlerhafter Datensatz. Und das Format ist eben festgelegt. Wenn du sagt, /n reicht, dann will ich dem zustimmen: Dann musst du deine Fehlerprüfung aber wie folgt machen: Lies mit VISA-Read den Puffer bis zum Endezeichen /n ein (das kann VISA, guckst du "Trennzeichen"). Jetzt musst du den String testen: vor /n muss eine Zahl im Format (z.B.) +##.## stehen. Du musst das so genau machen. Wie willst du sonst feststellen, dass der Punkt (siehe eines deiner Fehlerbeispiele) verloren gegangen ist? Vor diesem String muss dann ein ';' stehen usw.
Die Frage ist nun, was tun, wenn ein Fehler erkannt worden ist. Ohne ein entsprechend gutes Protokoll kannst du nur eins tun: den Datensatz ersatzlos verwerfen. Kaputte Daten kannst du ohne entsprechende Sicherung nicht reparieren. (In besonderen Fällen kann man anstelle des aktuellen, aber kaputten Datensatzen den vorhergehenden, aber ganzen Datensatz wiederholen als aktuell übernehmen.)
Was du eigenlich brauchst, ist ein fehlertolerantes Protokoll. Normalerweise würde man einen Datensatz mit mehreren Sicherheitsstufen verwenden: STX REP LEN <data> BCC ETX. Außerdem würde man die Datenpackete mit ACK respektive NAK quittieren. Ein solches Protokoll hat zwar den Vorteil, dass dir garantiert keine Datenpakete verloren gehen. Aber es macht halt viel Aufwand. Auf beiden Seiten der Datenübertragung. Wenn du dir diesen vielen Aufwand aber sparen willst, muss du damit Leben, dass ab und zu mal ein Datensatz fehlt.
Auf der anderen Seite: Normalerweise ist es eher unwahrscheinlich, dass ein Zeichen auf dem Kabel kaputt geht. Bei funktionsfähiger Hardware ist die Ausfallrate erfahrungsgemäß höchstens ein Promille. Wenn dir eins von zwanzig kaputt geht, stimtm was mit deiner Hardware nicht.