LabVIEWForum.de - Problem mit NUL characters

LabVIEWForum.de

Normale Version: Problem mit NUL characters
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo

Ich habe mir ein VI gebastelt welches einen Datenstrom am Seriellen Port einließt:
Der Datenstrom beinhaltet immer Nachrichten die dadurch gekennzeichnet sind, das sie mit ESC NUL als SYN-Flags beginnen (hex 1b 00 - dezimal 27 00).
Wenn ich diese Nachrichten einlese werden die NUL characters nicht eingelesen.

Ich habe gestern abend noch mit NI telefoniert und habe dort nachgefragt ob es sein kann, dass ein ReadExisting durch ein NUL terminiert wird, wie man es z.B. aus C kennt. Standartmäßig meinte er wäre es nicht so ich solle "DsicardNull" jedoch einfach auf false setzen um das als Fehlerquelle auszuschließen.
Nun gemacht getan gleiches Problem.

hat jemand da eine Idee?

Thomas
Lv86_img
[attachment=17063]
Ändere Deinen String mal in HEX-Display.
Hier in der ASCII-Tabelle kannst Du sehen, dass NUL kein Zeichen hat. Im HEX-Display müsstest Du aber "00" sehen.

Gruß Markus
So grad noch Probleme mit Upgrade auf 8.6.1 gehabt .. Aber NI ist ja kompetent^^

Also
Danke Markus, aber leider hat das nicht den gewünschten Effekt. Ich bekomm weiterhin nurdie ESC Bytes.
Dieses Mal werden sie halt als 1B angezeigt.

Thomas
Ok Problem gelöst.

Das Problem hier bei ist, dass ein Byte-Stream der an der Seriellen Schnittstelle ankommt und mit ReadExisting() ausgelesen wird mit einer ASCII NUL terminiert.
Abhilfe: durch ReadChar() oder ReadByte() ersetzen.
Dadurch wird das VI zwar etwas langsamer aber die NUL Statements fallen nicht weg.

Thomas
' schrieb:Ok Problem gelöst.

Das Problem hier bei ist, dass ein Byte-Stream der an der Seriellen Schnittstelle ankommt und mit ReadExisting() ausgelesen wird mit einer ASCII NUL terminiert.
Abhilfe: durch ReadChar() oder ReadByte() ersetzen.
Dadurch wird das VI zwar etwas langsamer aber die NUL Statements fallen nicht weg.

Thomas

Alternativ könntest Du in LabVIEW auch einfach VISA verwenden, die hat diese dumme C Eigenschaft nicht :-). Ein VISA Read endet nur wenn es die verlangte Anzahl Character gelesen hat, oder das Timeout abgelaufen ist, oder ein Fehler aufgetreten ist, oder der eingestellten End Char erkennt wurde und diese Option auch eingeschaltet ist.

Für den seriellen Port is End Char default eingeschaltet und auf CR eingestellt aber mit ein oder zwei Proeprties ist das einfach geändert.

Rolf Kalbermatter
Hallo Rolf

Da hast du recht. ich könnt Visa nehmen.. ich find es aber mit .Net etwas felxibeler weil du da halt genau sagen kannst wie du es auslesen möchtest oder auch Schreiben möchtest, in der Hinsicht bist du bei VISA etwas eingeengt.
Ok das ist vlielleicht etwas falsch ausgedrückt^^
Aber es ist bequemer weil man sonst alles hin und herformatieren muss.

Und ich muss meine Anwendung auch so offen halten, das ich im Fall auch diese Serielle Lösung durch TCP/IP ersetzen kann.
Aber naja^^ egal. Mit VISA ging es auchSmile
' schrieb:Hallo Rolf

Da hast du recht. ich könnt Visa nehmen.. ich find es aber mit .Net etwas felxibeler weil du da halt genau sagen kannst wie du es auslesen möchtest oder auch Schreiben möchtest, in der Hinsicht bist du bei VISA etwas eingeengt.
Ok das ist vlielleicht etwas falsch ausgedrückt^^
Aber es ist bequemer weil man sonst alles hin und herformatieren muss.

Und ich muss meine Anwendung auch so offen halten, das ich im Fall auch diese Serielle Lösung durch TCP/IP ersetzen kann.
Aber naja^^ egal. Mit VISA ging es auchSmile

Das letzte Argument ist lustig! ;-) VISA unterstützt nämlich auch TCP/IP und dazu musst Du nur den Resourcennamen änderen und allenfalls bei der Initialisation einige Properties anders setzen. Der Rest ist vollkommen transparent so den die Geräte auf der seriellen und TCP/IP Schnittstelle mit den gleichen Kommandos arbeiten.

Rolf Kalbermatter
' schrieb:Das letzte Argument ist lustig! ;-) VISA unterstützt nämlich auch TCP/IP und dazu musst Du nur den Resourcennamen änderen und allenfalls bei der Initialisation einige Properties anders setzen. Der Rest ist vollkommen transparent so den die Geräte auf der seriellen und TCP/IP Schnittstelle mit den gleichen Kommandos arbeiten.

Rolf Kalbermatter

Und wieder was gelernt^^ danke
Referenz-URLs