' schrieb:ich möchte Hexcode und Acsii über die VISA-Schnittstelle senden
"ASCII" und "HEX" sind Darstellungsformen von Zahlen.
Das, was du am Bildschirm liest, ist eine Darstellungsform. Das, was im Speicher abgelegt ist, ist eine Zahl. Das, was im Speicher abgelegt ist, kann man nicht sehen. Übertragen über VISA werden immer Zahlen - egal ob sie in HEX, ASCII, BINÄR oder DEZIMAL dargestellt werden.
Eine Zahl möge 65 sein. Dargestellt in Dezimal ist das dann "65", in ASCII "A", in HEX "41", in BINÄR "01000001", etc.
Wenn die Zahl 65 (129) übertragen werden soll, geht das am einfachsten mit nur einem Byte: Das Byte 65 (129) - dargestellt als HEX 41 (81 oder auch 0x81) oder als ASCII A (??) - wird eben übertragen. In der ASCII-Darstellung hat jede Bytezahl [0..255] ein spezifisches Symbol in der (sog.) ASCII-Tabelle, eben 65="A". Auch für 129 gibt es ein Zeichen. Weil jede Zahl genau durch ein einzelnes ASCII-Zeichen darstellbar ist, kann man eine "Einzel-Byte-Übertragung" auch als "ASCII-Übertragung" beschreiben.
In der HEX-Darstellung wird jede Bytezahl durch zwei Zeichen dargestellt, eben 65="41". Demzufolge werden zwei Zeichen übertragen, wenn man eine "HEX-Übertragung" macht. Die beiden Zeichen sind dann die Buchstaben (ASCII) "4" und "1", was den Zahlen 52 (0x34) und 49 (0x31) entspricht.
Zitat:ich kann auch anhand eines Zeichens das ich beim lesen des Strings detektiere, unterscheiden ob ein Hex String oder Ascii String vorliegt,
Das geht per se nicht.
Empfangen werde "31313131313131" - ist das ein Hex-String oder ein ASCII-String? Als letzterer hat der resultierende String den Wert "31313131313131". Eine Übertragung im Hexformat könnte als Wert "1111111" meinen. Maßgebend ist, was die Beschreibung der Schnittstelle sagt.
Wenn man eine Übertragung mit "HEX-Zahlen" macht, kann man eine gewisse Sicherheit einbauen - weil nur Zahlen aus dem Bereich [0..9, A..F] übertragen werden. Alle anderen Zahlen sind nicht erlaubt. Ein Empfang derer würde auf einen Fehler in der Datenübertragung hindeuten.
Nun zu deiner Aufgabe:
Wenn einer 0x81 als Zeichen überträgt, dann macht er eine reine binäre Übertragung - also ASCII. Als ASCII-Zeichen heißt das dann "SOH mit gesetzten 8. Bit" (
guckst du hier). Das Zeichen, das du als HEX bezeichnest, ist also lediglich ein Zeichen, das in HEX mit 0x81 dargestellt wird. Die anderen Zeichen, die du als ASCII bezeichnest, haben genau das selbe Format wie das Zeichen 0x81.
Wenn du 81 übertragen willst, dann kannst du das wie folgt machen: Nimm eine Stringkonstante, geht ins Kontextmenü und stell die Darstellungsform(!) auf HEX(!) um, schreib dann 81 (also die beiden Zahlen "8" und "1") rein. Der Inhalt des Strings ist dann ein Zeichen mit dem binären Wert 129, also 0x81. Willst du was ASCII-mäßiges übertragen, z.B. den Text "Muster", dann schreibst du den Text "Muster" ganz einfach in eine normale Stringkonstante.
Es gibt auch folgende Möglichkeit: Mach ein Array of U8 und schreib da die Werte rein, die du übertragen willst. Dieses Array kannst du per "Bytearray nach String" in einen String konvertieren.
Zitat:habe gelesen das LabVIEW keine Hex codes über VISA schickt und alles in Bytes umwandelt,
Das liegt eben daran, dass HEX zuerst mal eine Darstellungform ist. Übertragen werden in erster Linie mal nur "binäre Werte". Eine "HEX-Übertragung" im weiteren Sinne (nämlich im Sinne eines Protokolles) würde bedeuten, dass der Treiber aus jedem Zeichen (Bereich [0..255]), das er senden soll, zwei Zeichen (Bereich jeweils [0..9, A..F]) machen muss. Das ist aber nicht im Sinne eines "transparenten Treibers" (wie ihn VISA in erster Linie darstellt).
Dein Problem besteht darin: "Wie bekomm ich eine Zahl, für die ich beim Eintippen zwei Zeichen brauche, in ein einziges Zeichen gequetzt, damit es übertragen werden kann". Lösung: Siehe oben.