Frage zu serialport in Visual Basic 2008

Hallo zusammen,

ich habe ein kleines Programm geschrieben, dass Daten über die serielle Schnittstelle empfängt (Datenrate 57600 Baud, 16 Byte alle 10ms; 8bit, keine Parität 1 Stoppbit). Die Daten schreibe ich byteweise über FileStream in eine Datei. Die Daten sollen auch byteweise interpretiert werden (sollen also tatsächlich einen Wert zwischen 0 und 255 repräsentieren). Encoding habe ich auf default gestellt, damit werden auch die Zeichen über 127 dargestellt.
Funktioniert bis hierhin auch tadellos, solange ich nicht den Wert des Byte (also 0…255) heraushaben möchte, d.h. wenn ich das File nachher öffne, stehen halt die ASCII-Zeichen drin, grundsätzlich werden aber nachweislich alle Bytes empfangen (mit der Klasse SerialPort, …Datareceived).

Wenn ich nun beispielsweise schreibe:

.Write = Val(serialport.ReadExisting)

weil ich gelesen habe, dass ich mit Val den Wert des Zeichens bekomme, dann bekomme ich plötzlich nicht mehr alle Zeichen mit. Es werden die meisten Zeichen einfach verschluckt.

Was könnte ich hier falsch gemacht haben, dass die Übertragung (oder warscheinlich der Datenempfang) so stark beeinträchtigt wird? Wie kann ich die Bytes umwandeln, dass dies nicht passiert?

Vielen Dank für eure Mühe

Gruß

Michael

Hi!
Scheinbar verstehe ich Deine Frage noch nicht richtig. Du schreibst die Daten schon korrekt byteweise in die Datei, störst Dich aber daran, dass Dir das Programm, mit dem Du die Datei öffnest (notepad?), ASCII-Zeichen anzeigt?
Wie schreibst Du denn die Daten in den FileStream? Da müsstest Du doch schon den richtigen Datentyp haben…
Ansonsten kann ich Dir eigentlich nur raten, statt der Basic-Funktion Val() die deterministischeren Konvertierungen der Klasse Convert zu verwenden.

Gruß,
Martin

Hallo Martin!

Hi!
Scheinbar verstehe ich Deine Frage noch nicht richtig. Du
schreibst die Daten schon korrekt byteweise in die Datei,
störst Dich aber daran, dass Dir das Programm, mit dem Du die
Datei öffnest (notepad?), ASCII-Zeichen anzeigt?

Ja, denn ich möchte nicht die ASCII-Zeichen auswerten, sondern deren Integer-Wert aus der ASCII-Tabelle. Die Daten kommen von einem Mikrocontroller, der Messwerte liefert. Er hat aber nicht die Zeit, die Werte ins Dezimalsystem zu konvertieren und dann jede Stelle und die Steuerzeichen einzeln zu übertragen (kleiner Controller, der mit wichtigeren Dingen beschäftigt ist :smile: Das soll im Prinzip das Programm auf dem PC machen, am besten direkt nach dem Empfang der Daten, damit nachher nicht „§4dgt…“ im File drin steht, sondern „128 23 5 144 usw“.

Wie schreibst Du denn die Daten in den FileStream? Da müsstest
Du doch schon den richtigen Datentyp haben…
Ansonsten kann ich Dir eigentlich nur raten, statt der
Basic-Funktion Val() die deterministischeren Konvertierungen
der Klasse Convert zu verwenden.

Habe ich probiert, funktioniert aber leider auch nicht richtig (im File sehe ich dann sehr viele Nullen und dazwischen ein paar Werte.

Gruß

Michael

Achso, na dann…
Du willst also die String-Repräsentation der Bytes als Dezimalzahlen in die Datei schreiben. Nichts einfacher als das. Statt die Bytes als solche in den Filestream zu schreiben, formatierst Du sie vorher in einen String und schreibst den:

string byteAsString = string.Format("{0}", byteVal);

Im Formatstring kannst Du dann angeben, ob Du z.B. Hexadezimalzahlen haben willst, führende Nullen usw. usf.

Gruß,
Martin

Hallo Martin,

Ich werde deinen Tip erst später ausprobieren können (im Augenblick leider keine Zeit), auf jeden Fall aber vielen Dank dafür!

Eins macht mir nur noch Kopfzerbrechen… Wodurch könnte es kommen, dass, wenn ich die Daten die über die Schnittstelle kommen einfach in ein File oder ein Rich-Text-Fenster schreibe (über delegate) richtig rasant den Bildschirm füllen, und wenn ich irgendeine Typkonvertierung mache, ich den Fortschritt förmlich mitzählen kann?

Gruß

Michael

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Martin,

Ich werde deinen Tip erst später ausprobieren können (im
Augenblick leider keine Zeit), auf jeden Fall aber vielen Dank
dafür!

Eins macht mir nur noch Kopfzerbrechen… Wodurch könnte es
kommen, dass, wenn ich die Daten die über die Schnittstelle
kommen einfach in ein File oder ein Rich-Text-Fenster schreibe
(über delegate) richtig rasant den Bildschirm füllen, und wenn
ich irgendeine Typkonvertierung mache, ich den Fortschritt
förmlich mitzählen kann?

Wieder mal: Ohne Code…

Gruß

Michael

Gruß,
Martin