Laden...

[erledigt] Serielle Schnittstelle verschluckt Minus-Zeichen

Erstellt von emuuu vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.586 Views
emuuu Themenstarter:in
286 Beiträge seit 2011
vor 12 Jahren
[erledigt] Serielle Schnittstelle verschluckt Minus-Zeichen

Wunderschönen Abend erstmal,

mein Problem ist folgendes:

Ich will einen Roboter online regeln.. will meinen, der Roboter sendet Daten eines Sensors an die serielle Schnittstelle, das Programm analysiert die und schickt se zurück.

Das klappt soweit auch sehr gut. Mein einziges Problem ist, dass mein Programm sehr oft die Minus-Zeichen "verschluckt" das ist in sofern unwünschenswert, weil die Regelung dadurch nutzlos wird.

Dinge wie invoke für die Threads etc. habe ich beachtet:


SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
port.RtsEnable = true;
port.Encoding = Encoding.ASCII;
port.Open();

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            daten = port.ReadExisting();
            this.Invoke(new EventHandler(DisplayText)); 
        }


private void DisplayText(object sender, EventArgs e)
        {
            if (daten != "")
            {
                Werte.Add(i, int.Parse(daten)); 
            }
        }

Ich bin mir relativ sicher, dass das Problem darin liegt wie die Daten am serial port "in Empfang genommen werden".. ich hab aber keine so großen erfahrungen damit und darum keine idee mehr..

Eine Option ist es, dass ich relativ frei entscheiden kann, was ich vom Roboter schicken lasse (nur die werte, \n, \r, etc.) das könnte die Lösung evtl vereinfachen..

Schonmal danke im vorraus für die schnelle Hilfe
emuuu

2+2=5( (für extrem große Werte von 2)

F
10.010 Beiträge seit 2004
vor 12 Jahren

Und was ist Daten oder Werte?

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 12 Jahren

Die Daten sind die Differenz der Messwerte aus zwei Liniensensoren.. Also Integer-Werte die maximal an die 900 herankommen.

Gesendet werden die über ein Bluetooth-Modem, was, mit dem PC verbunden, einen COM-Port ansteuert.

Theoretisch könnte ich die mit jedem Schleifendurchlauf schicken, also sehr schnell, um die Übertragung nicht zu belasten begrenze ich die Datenmenge auf einen Sende-Vorgang alle halbe Sekunde.

2+2=5( (für extrem große Werte von 2)

U
1.688 Beiträge seit 2007
vor 12 Jahren

mein Programm sehr oft die Minus-Zeichen "verschluckt"

Woher weißt Du das? Wie hast Du sicher gestellt, dass die Minus gesendet werden? Was stellt z. B. das Programm "PortMon" fest?

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 12 Jahren

Ich habe den Roboter mit Hyperterminal verbunden und dann einen sensor auf schwarzen den anderen auf weißen untergrund gestellt. Da kommt dann sehr konstant ne Differenz von -600 raus.

Mein Programm gibt dabei aber nur 60, 63, 3, etc.. also werte die definitiv falsch sind.. ich glaube dass der da unter anderem das Minus und in dem Fall die Einer-Stelle unterschlägt.. Warum weiß ich wie gesagt auch nicht genau ich nehme an weil ich den Eingang oder den Port nicht richtig verwalte.

2+2=5( (für extrem große Werte von 2)

F
10.010 Beiträge seit 2004
vor 12 Jahren

Ich schätze eher das du die Datentypen durcheinander bringst.

Was steht denn in data drin wenn du was gelesen hast?
Bist du wirklich sicher das du die daten als string geliefert bekommst?

185 Beiträge seit 2005
vor 12 Jahren

Du musst dich selbst drum kümmern, dass du auch alle Zeichen empfangen hast. z.B. anhand CR oder LF.
Such mal hier nach seriall Port, da findest du viele Beiträge zu dem Thema.

M
28 Beiträge seit 2011
vor 12 Jahren

Wenn du frei entscheiden kannst, was der Roboter sendet, dann schliesse die Übertragung doch immer mit "\r\n" ab und nutze statt "port.ReadExisting" "port.ReadLine" - dann solltest du immer einen kompletten Datensatz bekommen.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 12 Jahren

Wenn du frei entscheiden kannst, was der Roboter sendet, dann schliesse die Übertragung doch immer mit "\r\n" ab und nutze statt "port.ReadExisting" "port.ReadLine" - dann solltest du immer einen kompletten Datensatz bekommen.

Das hats gebracht.. hab zwar nicht \r\n sondern blueLineFeed() verwendet (kommt aus der Bibliothek des Roboters, sollte aber den gleichen Befehl darstellen^^)

mit ReadLine() kommen jetzt alle Werte wie gewünscht an..

besten dank 😃

2+2=5( (für extrem große Werte von 2)