RS232 / Com-Port Hilfe

Hallo,
ich bekomme zum PC einen konstanten Datenstrom per USB2Com Adapter gesendet.
Das funktioniert alles einwandfrei mit CuteCom. Die Daten treffen ein.
Wie kriege ich das mit Xojo hin?
Die beiden Beispiele überprüfen alles mögliche empfangen aber die Daten nicht.
(ebenso der Serial Port Checker)
Ich brauch im Prinzip doch nur einen Dreizeiler:

  • Serial definieren (Baud, etc.)
  • Serial öffnen (der ist in den Beispielen immer offen???)
  • Daten auslesen (wenn überhaupt kommen nur Nullen)

Und eine Zeile mit close.
Das schein so primitiv zu sein, daß es dafür keine Dokumentation gibt, auch im Netz nicht.
Wer kann helfen? (bin Anfänger!)

Schau dir mal im Handbuch das Serial Steuerelement an.

Hab ich.
Deswegen schreibe ich hier ja.
Auch mit den beiden Beispielen kommen keine Daten an… :frowning:

Der Arduino liefert am seriellen Ausgang Daten.
Das datenformat is korrekt eingestellt.
Alles kein Problem. VB6.0 kann die Daten empfangen.
Aber da ist auch alles dokumentiert und die Beispiele funktionieren.
Nur unter Xojo geht das nicht so einfach ;-(

whlst du den Port aus ber system.serialport Funktionen?

Ja, bei einer “Eigenkonstruktion”. Habe das Ergebnis dann weiter verwendet.
Das funktioniert alles nicht.
Dieser “Serial Port Checker” verwendet das auch.
Der sollte funktionieren. Liefert aber auch keine Daten.
Genau das ist der Grund warum ich nicht von VB6.0 weg komme.
Das ist irgendwie besser dokumentiert und es gibt im Web etliche Beispiele…

Zufall! Der einzig wahre Helfer! :slight_smile:
Für alle anderen Anfänger:

Serial1.Baud=4800
Serial1.Bits = Serial.Bits8 ’ Übertragungsdaten eintragen
Serial1.Parity = Serial.ParityNone
Serial1.Stop = Serial.StopBits1
Serial1.SerialPort=System.SerialPort("/dev/ttyUSB0") ’ den richtigen Port raussuchen!!
If Serial1.Open =false then MsgBox “The serial port could not be opened.”

WICHTIG! Dem Serial1 den EventHandler “DataAvailableEvent” hinzufügen und folgendes eintragen:

If Serial1.BytesAvailable >10 then ’ Wenn man einen 10 Byte Datenstrom hat
TextField1.text=DefineEncoding(Serial1.Read (10), Encodings.ASCII)
end if

Jetzt nur noch den Datenstrom sortieren…
Fertig! Der SerialPortChecker funktioniert nicht (so einfach).

Ganz so einfach ist es dann doch nicht… :frowning:
Gem CuteCom ist der serielle Datenstrom ok. Alle Werte sind ber Stunden konstant.
Unter Xojo “verschwinden” aber gelegentlich einzelne, manchmal bis zu 10 Zeichen, was sich natrlich katastrophal fr die weitere Auswertung auswirkt.
Manchmal dauert es Minuten. Erstaunlicherweise gengt es, wenn man das Xojo Fenster “schttelt”, um diesen Fehler zu provozieren!
Das hat wohl was mit der Auslastung der Anwendung zu tun? Der Systemmonitor zeigt, da der PC cool bleibt.
Das ist unabhngig von der Baudrate (4800-19200 getestet).
Wo kann der Fehler sein?

da frage ich mich, ob der interne Puffer vielleicht zu klein ist. muss man mal schauen.

Hmmm, wie mache ich das?

Ich habe im Event Serial1.DataAvailable eine Abfrage:
If Serial1.BytesAvailable >StrLen then
TextString=Serial1.Read (StrLen)
. . .
Das leert den Puffer sobald genug Daten vorhanden sind. Da kann doch kein Puffer überlaufen?
Ich habe in meiner Verzweifelung auch schon auf mehr Daten gewartet, also StrLen + 5 oder so.
Das bringt aber nichts. Es funktioniert ja auch einwandfrei. Es sei denn man schüttelt…

Hmmm, anscheinend gelöst.
Ich habe die Zeile:

If Serial1.BytesAvailable >StrLen then

geändert in:

If Serial1.BytesAvailable >StrLen * 2  then

Jetzt geht das fehlerfrei. Warum? Ein Timingproblem?
Is it a bug or a feature?

Nachtrag:
ich lasse mir NACH dem Auslesen des Strings BytesAvailable ausdrucken.
Dieser Wert kann ja eigentlich nicht unter 1 x StrLen sinken,
da nur 1 x StrLen ausgelesen werden darf, wenn BytesAvailable > 2 x StrLen ist.
Tut er aber doch! Stellenweise auf fast null!

So ganz funktioniert das nicht. Ist es NICHT möglich mit Xojo eine Zeile (ReadLine?) aus zu lesen?
Die Zeilen sind immer mit EndOfLine angeschlossen.
Vielleicht komme ich damit weiter:
http://documentation.xojo.com/index.php/Serial.LineStateChanged
Nur mit der Doku komme ich nicht klar.

Vielleicht kann das Problem mit

dim mb as MemoryBlock = Serial1.ReadAll() (es wird solange eingelesen bis keine Daten mehr vorhanden sing)

behoben werden. Auswerten kann man das wie folgt

mb.size = enthlt die Anzahl der gelesenen Bytes

mb.byte(0) = erster Wert
mb.byte(1) = zweiter Wert
mb.byte(2) = usw. bis > mb.size

Dieser Tipp hat mir bei der Auswertung groer Datenmengen vom Arduino sehr geholfen. Luft bisher in Echtzeit einwandfrei ohne Aussetzer.

Hi, das ndert aber nichts. Ich bekomme keine kompletten Zeilen, die ja vom Arduino hbsch mit endofline getrennt werden. Mit ReadAll wird das alles wieder zerhackt, weil Xojo nicht wei, wie man bis zum Zeilenende ausliest.
Der String wird ja auch ausgelesen, wenn er noch nicht zu Ende bertragen ist.
Der Rest verbleibt dann im Puffer und wird beim nchsten mal mit ausgelesen.
Also mu ich den String dann selber wieder irgendwie auseinanderpfriemeln.

Also du bekommst die Daten in Hppchen. Da musst du solange sammeln, bis ein Zeilenende da ist. Und dann verarbeitest du die Zeile und sammelst weiter.

Aha, ich schreibe alles in einen String und lese dann nur immer eine Zeile aus. Aber wie mache ich das denn? Irgendwie nach dem Zeilenende suchen, Stringlnge ermitteln und dann ausschneiden (Left?)?

genau.
Am Besten in einer While Schleife schauen, solange Zeilenende da ist.

Hmmm. Wie kann ich mit Xojo nach dem Zeilenende “schauen”?
Einfach ne Zeile auslesen geht nicht?
Wenn ich Daten an den Arduino schicke, der kann zeilenweise auslesen.