Ein paar Hinweise:
1) Du spezifizierst überall ein Bufferlänge von 8194 Bytes für die Stringbuffer obwohl du daneben auch noch jeweils einen Parameter übergibts wieviele Bytes der jeweilige Buffer maximal empfangen kann. Ändere diese Zahl in den Variablennamen der entsprechenden Längenvariablen. Zwar ist 8194 immer grösser dann die Zahl die Du dann effektiv als Länge angibst, also passiert so kein Crash, ABER!!!! wenn Du das immer so machst gehst Du irgendwann mal bei einer Funktion mit der Länge spielen und vergisst den Buffer auch länger zu machen und Kabumm, krachts. Zudem ist das schwerwiegende Speicherverschwendung wenn Du überall einen Buffer von 8194 Bytes übergibst aber die Funktion nur 16 davon verwenden darf!
2) Der Rückgabewert der ReadRaw Funktion liefert gemäss Dokumentation -1 zurück im Fehlerfall und 0 oder eine positivie Zahl die angibt wieviele Bytes effektiv in den Buffer geschrieben wurden.
3) Da diese Funktion Rawdaten zurückgibt kann auch ein Nullwert im Buffer vorkommen. Da Du diesen Wert als Stringtyp definiert hast, der als C Stringpointer übergeben wird, kontrolliert LabVIEW nach der Rückkehr der Funktion ob der Buffer ein Nullbyte enthält und kürzt den String bis vor dieses Nullbyte. Das ist korrekt den Du hast angegeben, dass es ein C Stringpointer ist und bei C Strings wird halt einfach der Characterwert hinter dem letzten gültigen Character auf NULL gesetzt. Um das zu verhindern machst Du daraus ein Bytearray und übergibst das als C Array Pointer an die Funktion. Da Arrays durchaus 0 als Wert enthalten dürfen macht LabVIEW hier keinen Scan nach der Zürückkehr und lässt Dir den Buffer in der Länge die Du am Eingang angegeben hast.
4) Last but not least kann der Buffer natürlich weniger Bytes enthalten dann die Büfferlänge die Du angegeben hast, Hier verwendet man dann ein Array Subset mit der Länge die die Funktion als Rückgabewert zurückgegeben hat, aber nur wenn dieser Wert grösser ist dann -1, ansonsten hat die Funktion einen Fehler gehabt und solltest Du saubere Fehlerbehandlung durchführen. Nach dem Array Subset verwendest Du noch ein Byte Array zu String wenn Du unbedingt willst und dann kannst Du Dir den RawBytebuffer doch noch als String betrachten, aber eigentlich ist das wahrscheinlich irreführend, raw Bytes sind normalerweise keine Strings.
Und nein gemäss C Syntax besteht absolut kein Unterschied zwischen einem ANSI C Stringpointer und einem Byte Arraypointer. Aber gemäss uralter C Konvention benützen halt alle Stringfunktionen dieses Nullbyte, währenddem Arrayfunktionen typischerweise immer einen expliziten Längenparameter notwendig machen.