www.mikrocontroller.net

Forum: PC-Programmierung c# problem, zeichensatz?


Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

       private void OnPortReciveData(object sender, SerialDataReceivedEventArgs e)
        {
            StringBuilder response = new StringBuilder();
            do
            {
                response.Append(ConvertAsciiToUnicode(serialPort.ReadExisting()));
            } while (serialPort.BytesToRead > 0);
            HandleResponse(response.ToString());
        }

        private void HandleResponse(string input)
        {
            received.Append(input);

            SetText(input);
        }

        private string ConvertAsciiToUnicode(string theAsciiString)
        {
            // Create two different encodings.
            Encoding aAsciiEncoding = Encoding.ASCII;
            Encoding aUnicodeEncoding = Encoding.Unicode;
            // Convert the string into a byte[].
            byte[] aAsciiBytes = aAsciiEncoding.GetBytes(theAsciiString);
            // Perform the conversion from one encoding to the other.
            byte[] aUnicodeBytes = Encoding.Convert(aAsciiEncoding, aUnicodeEncoding,
            aAsciiBytes);
            // Convert the new byte[] into a char[] and then into a string.
            char[] aUnicodeChars = new
            char[aUnicodeEncoding.GetCharCount(aUnicodeBytes, 0, aUnicodeBytes.Length)];
            aUnicodeEncoding.GetChars(aUnicodeBytes, 0, aUnicodeBytes.Length,
            aUnicodeChars, 0);
            string aUnicodeString = new string(aUnicodeChars);
            return aUnicodeString;
        } 

        private void SetText(string text)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.textBox.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.textBox.AppendText(text);
            }
        }

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Mal mit "hterm" ausprobiert?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.