Forum: PC-Programmierung VB.Net 2010 Express lese Müll wenn ASCII > 127


von Christof Rieger (Gast)


Lesenswert?

Hallo Forengemeinde,
Ich verwende die FTD2XX_NET.dll in Verbindung mit VB.Net 2010 Express.
(Die FTD2XX_NET.dll ist die Softwareschnittstelle zu einem USB->RS232 
umsetzers)
Das funktioniert soweit sehr gut.
Um Daten zu übertragen bildet man eine String-Zeichenkette. Jedes 
Zeichen entspricht ein Byte. Den String übergibt man dann der Sub.
Sendent klappt das einwandfrei auch mit Zeichen zw. ASCII 128 und 255, 
Sprich Bit7 ist gesetzt.
Beim lesen geht das auch suprer solange Bit 7 nicht gesetzt ist.
Ist Bit 7 gesetzt kommt nur Müll raus.

Public FT_InBuffer As String = ""
Public trasmited As Integer
Public recived As Integer
....
FT_Device.Read(FT_InBuffer, trasmited, recived)

Datum=(Asc(FT_InBuffer(i))

Kennt jemand das Problem ?

LG Christof

von bluppdidupp (Gast)


Lesenswert?

Wenn du kein ASCII hast (sprich das 8.Bit verwendest), solltet du die 
string-Varianten von .Read() und .Write() vermeiden, da verwendet ftdi 
intern Encoding.ASCII, welches das 8.Bit ignoriert.

Nimm die byte[]-Varianten und wandle mit:
Encoding enc=Encoding.GetEncoding(1252);
// bzgl. der 1252: http://en.wikipedia.org/wiki/Windows-1252
// das ist in der Regel die passende Codepage

und enc.GetBytes() bzw. enc.GetString() zwischen byte[] und string um.
(Ich bin C#'ler, wird aber in VB.net wohl ähnlich/identich sein)

von Rolf M. (rmagnus)


Lesenswert?

Christof Rieger schrieb:
> Um Daten zu übertragen bildet man eine String-Zeichenkette. Jedes
> Zeichen entspricht ein Byte. Den String übergibt man dann der Sub.
> Sendent klappt das einwandfrei auch mit Zeichen zw. ASCII 128 und 255,
> Sprich Bit7 ist gesetzt.

ASCII hat nur 7 Bit. Daher gibt es da kein 128 bis 255 und kein Bit 7. 
Siehe auch http://de.wikipedia.org/wiki/Ascii
Alles, was darüber hinaus geht muß mit einem anderen Encoding gemacht 
werden. Welches das ist, hängt davon ab, was die Gegenstelle verwendet.

von Christof Rieger (Gast)


Lesenswert?

Stimmt !
ASCII ist nur bis 127 definiert. Das hatte ich verdrängt.
Damit sind die Befehle Chr()(Byte zu Zeichen) und Asc()(Zeichen zu Byte) 
nicht korrekt.
Eine Code-Tabellenbehandlung benötige ich nicht.

Wenn die FTD2XX_NET.dll mir:

65 67 69 189 in den String-Buffer schreibt sieht VB.NET
A  C  E  [irgendwass]
Ich brauche jetzt eine Möglichkeit aus
A  C  E  [irgendwass] unverändert wieder
65 67 69 189 zu machen. Mir ist jetzt klar das Asc([irgendwass]) nicht 
geht!
und warscheinlich Chr(189) auch nicht wirklich das richtige macht.
Ich bräuchte eine art Rawread und Rawwrite !

Kennt das jemand ?

LG Christof

von Christof Rieger (Gast)


Lesenswert?

Ah, ich habe was gefunden:

http://dotnet-snippets.de/dns/string-in-byte-array-und-zurueck-wandeln-SID645.aspx

Jetzt verstehe ich was bluppdidupp meint.

von Arc N. (arc)


Lesenswert?

Christof Rieger schrieb:
> Ich bräuchte eine art Rawread und Rawwrite !
>
> Kennt das jemand ?

FTD2XX_NET.dll mit den Funktionen Read und Write (die es in Varianten 
für Strings und Byte-Arrays gibt), dazu das passende Encoding
Beitrag "Re: VB.Net 2010 Express lese Müll wenn ASCII > 127"
und/oder man könnte auch die FTD2XX_NET.dll entsprechend erweitern 
http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples/CSharp/FTD2XX_NETclass.zip

von Christof Rieger (Gast)


Lesenswert?

Fettes Danke an Arc Net,
Ich hatte mir damals nur ein Programmbeispiel angeschaut, und da wurde 
alles nur über Strings übergeben.
So kam ich nicht auf die Idee, das es auch mit Bytearrays geht.
Ich habe mein Programm umgeschrieben und jetzt klaptt es mit Bit 7

Ein Toller Nebeneffekt das Programm ist um 30% schneller geworden.

LG Christof

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.