Forum: PC-Programmierung c# problem, zeichensatz?


von morph (Gast)


Lesenswert?

also das problem ist folgendes, von einem pic kommt über die serielle 
schnittstelle folgendes:

0:64 1:64 2:63 3:64;
0:64 1:64 2:64 3:64;
0:64 1:64 2:64 3:64;
0:64 1:64 2:63 3:64;


am pc in einer textbox bleibt dann folgendes über:

0:::0:440:2:

0:440:1:3:0:64640: 2:;

0:64640: 1: 3:0:0: 2:0:0:0::
0:0:::0:430:2:

0:440:1:3:0:64640: 2:;

0:64640: 1: 3:0:0:0:0:0::
0:40:::0:440:2:

0:440:1:3:0:64630: 2:;

0:64640: 1: 3:0:

ich verstehe leider nicht warum
1
       private void OnPortReciveData(object sender, SerialDataReceivedEventArgs e)
2
        {
3
            StringBuilder response = new StringBuilder();
4
            do
5
            {
6
                response.Append(ConvertAsciiToUnicode(serialPort.ReadExisting()));
7
            } while (serialPort.BytesToRead > 0);
8
            HandleResponse(response.ToString());
9
        }
10
11
        private void HandleResponse(string input)
12
        {
13
            received.Append(input);
14
15
            SetText(input);
16
        }
17
18
        private string ConvertAsciiToUnicode(string theAsciiString)
19
        {
20
            // Create two different encodings.
21
            Encoding aAsciiEncoding = Encoding.ASCII;
22
            Encoding aUnicodeEncoding = Encoding.Unicode;
23
            // Convert the string into a byte[].
24
            byte[] aAsciiBytes = aAsciiEncoding.GetBytes(theAsciiString);
25
            // Perform the conversion from one encoding to the other.
26
            byte[] aUnicodeBytes = Encoding.Convert(aAsciiEncoding, aUnicodeEncoding,
27
            aAsciiBytes);
28
            // Convert the new byte[] into a char[] and then into a string.
29
            char[] aUnicodeChars = new
30
            char[aUnicodeEncoding.GetCharCount(aUnicodeBytes, 0, aUnicodeBytes.Length)];
31
            aUnicodeEncoding.GetChars(aUnicodeBytes, 0, aUnicodeBytes.Length,
32
            aUnicodeChars, 0);
33
            string aUnicodeString = new string(aUnicodeChars);
34
            return aUnicodeString;
35
        } 
36
37
        private void SetText(string text)
38
        {
39
            // InvokeRequired required compares the thread ID of the
40
            // calling thread to the thread ID of the creating thread.
41
            // If these threads are different, it returns true.
42
            if (this.textBox.InvokeRequired)
43
            {
44
                SetTextCallback d = new SetTextCallback(SetText);
45
                this.Invoke(d, new object[] { text });
46
            }
47
            else
48
            {
49
                this.textBox.AppendText(text);
50
            }
51
        }

auch ohne die umwandlung von ascii in unicode sieht das so aus :| hat 
einer die zündende idee wonach ich suchen muss?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Umwandlung von ASCII/ANSI nach Unicode ist nur relevant, wenn nicht 
mit dem 7-Bit-ASCII-Zeichensatz darstellbare Zeichen übertragen werden 
sollen. Das scheinen bei Dir aber nur Zahlen und Doppelpunkte zu sein.

Das Problem liegt also woanders; vermutlich ist Deine serielle 
Empfangsroutine verbesserungsbedürftig. Wie sieht's denn in einem 
richtigen Terminalprogramm aus? (Hyperterminal genügt)

von morph (Gast)


Lesenswert?

das kopierte ist ein auszug aus einem terminalprogramm :) in dem falle 
zwar aus putty kopiert, aber im HT siehts nicht anders aus.

den fehler hab ich nun eingekreist: es funzt wenn man eine textbox 
missbraucht als string-speicher.

weder stringbuilder, noch string selbst funktionieren, da wird entweder 
verstümmelt oder es bricht gleich nach "0:" ab. ich denke es liegt hier, 
aber ich wüsste echt nicht mit welchem datentyp die textbox arbeitet, 
dass hier der fehler nicht auftritt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß der empfangene Datenstrom auch Steuerzeichen wie 
binäre Nullen enthält?

Mal mit "hterm" ausprobiert?

von Ralf (Gast)


Lesenswert?

> das kopierte ist ein auszug aus einem terminalprogramm :) in dem falle
> zwar aus putty kopiert, aber im HT siehts nicht anders aus.

> den fehler hab ich nun eingekreist: es funzt wenn man eine textbox
> missbraucht als string-speicher.

> weder stringbuilder, noch string selbst funktionieren, da wird entweder
> verstümmelt oder es bricht gleich nach "0:" ab. ich denke es liegt hier,
> aber ich wüsste echt nicht mit welchem datentyp die textbox arbeitet,
> dass hier der fehler nicht auftritt.

Also, wenn die Terminalprogramme auch Mist ausspucken, dann hast du den 
falschen Code gepostet :) Offenbar liegts dann entweder an deinem µC 
oder auf dem Weg von µC zu PC.
Das ganze mit einer Textbox gerade zu biegen, ist murks. Lad dir 
beispielsweise mal BrayTerminal runter (oder eine andere 
Terminalsoftware, welche die empfangenen Daten in Hex anzeigen kann), 
und dann poste mal die empfangenen Hex-Daten. Ich tippe nämlich auch auf 
Sonderzeichen im Empfang.

Ralf

von morph (Gast)


Lesenswert?

hä?

das terminalprogramm spuckt klarerweise keinen mist aus.

danke für den sinnlosen beitrag.


nein, der datenstrom enthält aus \n und \r am ende keine weiteren 
steuerzeichen.

lg

von morph (Gast)


Lesenswert?

argl, wie krank

der c18 gibt als leerzeichen \0 aus, die terminalprogramme stört das 
wenig, aber scheinbar c#.

kann es das sein? wirds wohl :|

87 60 0F 80 78 00 00 78 03 78 CC 78 00 18 0F 00 87 60 0F 60 0F 00 00 78 
0C 78 CC 78 00 18 0F 00 87 66 0F 78 0F 00 00 78 0F 78 CC 78 00 32 30 34 
30

einige 00 da drinnen und wenn ich mich recht erinnere ist das das 
terminierungszeichen eines strings

sorry für das mim sinnlosen beitrag ;)

von Severino R. (severino)


Lesenswert?

morph wrote:

> einige 00 da drinnen und wenn ich mich recht erinnere ist das das
> terminierungszeichen eines strings

In C schon. In C# (und .NET) eher nicht.

Kannst ja versuchen, die Nullen mit String.Replace() in Leerzeichen zu 
konvertieren.

von morph (Gast)


Lesenswert?

hab die dinger jetzt mit trimEnd() rausgefiltert. trimend deshalb weil 
ich sowieso zeichenweise einlese und das schon für die \n und \r 
verwende.

siehe da, es funktioniert, wobei mich das dennoch etwas schreckt. ich 
glaub ich muss mich dem c18 compiler etwas mehr widmen, das hat doch 
einige eigenarten.

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.