Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[erledigt] Serielle Schnittstelle verschluckt Minus-Zeichen
emuuu
myCSharp.de - Member

Avatar #avatar-4078.jpg


Dabei seit:
Beiträge: 287

Themenstarter:

[erledigt] Serielle Schnittstelle verschluckt Minus-Zeichen

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von emuuu am .
2+2=5 (für extrem große Werte von 2)
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Und was ist Daten oder Werte?
private Nachricht | Beiträge des Benutzers
emuuu
myCSharp.de - Member

Avatar #avatar-4078.jpg


Dabei seit:
Beiträge: 287

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Zitat von emuuu
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?
private Nachricht | Beiträge des Benutzers
emuuu
myCSharp.de - Member

Avatar #avatar-4078.jpg


Dabei seit:
Beiträge: 287

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
MartinH
myCSharp.de - Member

Avatar #avatar-1761.gif


Dabei seit:
Beiträge: 183
Herkunft: Asperg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
moDiag
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
emuuu
myCSharp.de - Member

Avatar #avatar-4078.jpg


Dabei seit:
Beiträge: 287

Themenstarter:

beantworten | zitieren | melden

Zitat von moDiag
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 :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von emuuu am .
2+2=5 (für extrem große Werte von 2)
private Nachricht | Beiträge des Benutzers