Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Auswerung von RS232 - Signalen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 17.11.2010, 23:10    Titel: Auswerung von RS232 - Signalen Antworten mit Zitat

Guten Abend zusammen,

ich habe mich daran gemacht daten die von einem mikrocontroller gesendet werden zu empfangen. Diese daten sehen in etwa so aus:

1491
5001
1392
5002
1292
5003
1492
5001
1393
5002
1293
5003
nach jeder vierstelligen zahl wird ein leerzeichen geschickt


Dank diesem hilfreichen beitrag:
http://forum.qbasic.at/viewtopic.php?t=5856&highlight=rs232
bin ich schon so weit, dass folgendes empfangen wird:

1491
5001
1392
5002
1292
5003
1492
500
1
1393
5002
1293
5003
1493
5001
1394
500
2
1294
5003
1494
5001
1395
5002
1295
500
3
1495
5001
1396
5002
1296
5003
1496
500
1
1397
5002

wie kann ich es nun noch hinbekommen dass das ende einer Zahle eindeutig erkannt wird?

ich habe den Code bereits leicht modifiziert:

Code:
SCREEN 19

Dim temp As integer
Dim graphx As integer
Dim graphy As Integer

graphx = 200
graphy = 0

LINE (200, 10)-(790, 266), 15, B
Line (190, 266)-(210, 266), 15                  ' y - Achsenbenennung 0
Locate 17,22
Print 0

Line (190, 143)-(210, 143), 15                  ' y - Achsenbenennung 127,5
Locate 10,19
Print 127.5

Line (190, 10)-(210, 10), 15                  ' y - Achsenbenennung 255
Locate 1,20
Print 255

Open Com "COM1: 9600, N, 8, 1,cs0,ds0,cd0,rs" As #1

OPEN "test.txt" FOR APPEND AS #2
   
Do

While Loc(1) > 0                                  ' check if data in RS232 buffer
Input #1,temp                                    ' get data terminated with CR
WRITE #2, temp
   
Locate 1,1
Print "Temp " ; temp ; "  "

graphy = 266
graphy = graphy - temp
PSet(graphx, graphy), 2
graphy = 256
If graphx = 790 Then                              ' wenn rechte linie erreicht, x = 0
   graphx = 200
EndIf
graphx = graphx + 1
Wend



Sleep 1                                          ' limit CPU usage
Loop Until Inkey$ = Chr$(27)                      ' exit with esc key
close #1
CLOSE #2
End


MfG Sippo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 17.11.2010, 23:59    Titel: Antworten mit Zitat

1) du fänst mit nem leeren string an ("")
2) du machst input und hängst die eingabe an den string dran (mit +).
3) dann schaust du ob ein leerzeichen drin ist (referenz -> instr).
3.a.1) Wenn ja, nimmst du das was vor dem leerzeichen steht als zahl (referenz -> mid bzw. left).
3.a.2) Den rest vom dem string hebst du auf (referenz -> mid bzw. right).
3.a.3) wiederholen ab 3).
3.b.1) Wenn kein leerzeichen drin ist machst du das nächste input, ohne zuvor ne zahl aus deinem buffer-string zu holen, weil noch nichts "fertiges" drin steht. also wiederholen ab 2).
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 110

BeitragVerfasst am: 18.11.2010, 01:06    Titel: Antworten mit Zitat

Hallo,

versuch's mal damit:

Code:
...

While Loc(1) > 0

temp = INPUT(7, #1) ' 4 Ziffern + Leerzeichen + CR + LF
Print #2, temp;     'Semikolon am Ende!!!

...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 18.11.2010, 01:30    Titel: Antworten mit Zitat

das crlf kommt nicht mit über die leitung so wie ich ihn verstanden hab?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 18.11.2010, 18:00    Titel: Antworten mit Zitat

CRLF? was ist das denn? wenn das was bringt wenn man diese Buchstaben sendet wäre das auch kein Problem

MfG Sippo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 18:07    Titel: Antworten mit Zitat

http://de.wikipedia.org/wiki/CRLF
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 18.11.2010, 18:10    Titel: Antworten mit Zitat

Achso , ok lächeln

da im ASCII dafür Hex A0 bzw. dezimal 10 vorgesehen ist wird das wohl nicht gehen, da ich dann mit meinen Dateien in konflikt kommen würde

MfG Sippo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 18:15    Titel: Antworten mit Zitat

Wenn deine Daten nur aus Ziffern und Leerzeichen bestehen, dann bewegen sie sich ausschließlich im ASCII-Bereich 32 und 48 bis 57.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 18.11.2010, 18:19    Titel: Antworten mit Zitat

Diese muss ich dann aber wieder in integer umwandeln um sie aufs koordinatensystem zu kriegen...
gibts da nen befehl für? werd mal bissle in der referenz wühlen happy

MfG Sippo

Edit: gefunden: VAL cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 18:59    Titel: Antworten mit Zitat

Ähm - dir ist der Unterschied zwischen einer Ziffer wie "1" und ihrem ASCII-Code 49 schon klar? Wenn du mit eingabe = INPUT(1) einliest, dann hast du es als String vorliegen - mit VALINT(eingabe) erhältst du den zugehörigen Zahlenwert, mit ASC(eingabe) den zugehörigen ASCII-Wert.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 18.11.2010, 19:18    Titel: Antworten mit Zitat

ja der unterschied ist mir schon klar, deshalb will ichs ja umformen happy

ich hab nun mal nen kleinen Testcode geschrieben aber den muss ich wohl nochmal überarbeiten, der hängt sich nemmich immer in der schleife mit dem input auf. wa ja nur heißen kann, dass er kein leerzeichen findet oder ich nen fehler in dem befel hab oder?

Code:
SCREEN 19

Dim temp As string
dim wert as string
dim count as integer
dim kont as integer
dim zahl as integer

Open Com "COM1: 9600, N, 8, 1,cs0,ds0,cd0,rs" As #1
   
Do
    do
        input #1, temp
        wert = wert + temp                                    ' get data terminated with CR
        if (INSTR(wert," ")) then
            kont = 1
            wert = RTRIM(wert, " ") ' Leerzeichen entfernen
            zahl = VALINT(wert)     ' in Zahl umwandeln
        endif
    loop while kont = 0
    kont = 0
    print zahl
    sleep 1
Loop Until Inkey$ = Chr$(27)                      ' exit with esc key

close #1
End


MfG Sippo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 18.11.2010, 20:08    Titel: Antworten mit Zitat

ich habe nun noch ein wenig an dem Code herumprobiert wenn ich ihn folgendermaßen umschreibe bekomme ich lauter 0er angezeigt:
Code:

SCREEN 19

Dim temp As string
dim wert as string
dim count as integer
dim kont as integer
dim zahl as integer

Open Com "COM1: 9600, N, 8, 1,cs0,ds0,cd0,rs" As #1
   
Do
    do
        input #1, temp
        wert = wert + temp                                    ' get data terminated with CR
        if (INSTR(wert," ")) then
            kont = 1
            wert = RTRIM(wert, " ") ' Leerzeichen entfernen
            zahl = VALINT(wert)     ' in Zahl umwandeln
        endif
    loop while kont = 0
    kont = 0
    locate count,1
    print zahl
    count = count + 1
    if count = 20 then count = 0
    sleep 1
Loop Until Inkey$ = Chr$(27)                      ' exit with esc key

close #1
End


Kann mir da vielleicht jemand weiterhelfen?

MfG Sippo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 20:43    Titel: Antworten mit Zitat

Hmm, muss ich nochmal drüber schauen - aber das RTRIM bräuchtest du nicht (ist aber nicht der Grund des Fehlers).

Du musst aber auf jeden Fall nach der Auswertung wert wieder auf "" setzen, da du sonst an den schon bestehenden weiter anhängst.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 18.11.2010, 20:46    Titel: Antworten mit Zitat

uff

du bekommst lauter 0 er angezeigt, wegen dem hier:
if (INSTR(wert," ")) then

er springt nicht in die if hinein

Code:
 
        if (INSTR(wert," ")) then
          kont = 1
            wert = RTRIM(wert, " ") ' Leerzeichen entfernen
            zahl = VALINT(wert)     ' in Zahl umwandeln
        endif

würde ich so machen:

for i = 1 to len(wert)
   if mid(wert,i,1) = chr(32) then
      zahl = val(mid(wert,1,i-1)
      wert = ""
      i = len(wert)
kont = 1
   end if
next
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 21:06    Titel: Antworten mit Zitat

Willst du wirklich nach jedem Anhängen eines Zeichens den ganzen String wieder von vorn nach einem Leerzeichen durchsuchen? (gut, INSTR macht natürlich auch nichts anderes) Warum nicht einfach nur das letzte ausgelesene Zeichen prüfen? zwinkern

Zum Verlassen einer Schleife gibt es übrigens EXIT FOR; ist sauberer als ein eigenhändiges Setzen der Zählvariablen.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 18.11.2010, 21:18    Titel: Antworten mit Zitat

alla so?
if mid(wert,len(wert),1) = chr(32) then ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 21:19    Titel: Antworten mit Zitat

Oder RIGHT(wert, 1). Oder, noch einfacher, gleich temp
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Andy19312



Anmeldungsdatum: 22.10.2005
Beiträge: 428

BeitragVerfasst am: 18.11.2010, 21:21    Titel: Antworten mit Zitat

jepp

grinsen

Aber wenn er temp gleich nach einem Leerzeichen prüfen will, müsste er den ganzen Code total umkrempeln.

So gehts aber auch:

Code:

    do
        input #1, temp
   if temp = chr(32) then
   kont = 1
   zahl = val(wert)
   wert = ""
   else
        wert = wert + temp      
   end if

    loop while kont = 0
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 18.11.2010, 21:36    Titel: Antworten mit Zitat

Zitat:
Aber wenn er temp gleich nach einem Leerzeichen prüfen will, müsste er den ganzen Code total umkrempeln.


Stimmt, ja. Er muss in seinem Programm eine komplette Zeile austauschen ... cool
Der letzte Vorschlag ist aber auf jedenfalls besser.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sippo



Anmeldungsdatum: 17.04.2008
Beiträge: 125

BeitragVerfasst am: 21.11.2010, 15:19    Titel: Antworten mit Zitat

Vielen Dank für eure Antworten,

ich hatte in den letzten Tagen leider kaum Zeit und bin nicht zum weitermachen gekommen, also entschuldigt bitte die Verzögerung.

der Vorschlag von Andy scheint mir vielversprechend. ich habe versucht diesen umzusetzen allerdings verfängt sich das Prog jetzt wieder in der Schleife und es wird gar nichts angezegt.
Das CHR habe ich auf 20 geändert da dies laut der ASCII tabelle welche ich einsah die leerstelle sein sollte.

Code:
SCREEN 19

Dim temp As string
dim wert as string
dim count as integer
dim kont as integer
dim zahl as integer

Open Com "COM1: 9600, N, 8, 1,cs0,ds0,cd0,rs" As #1
   
Do
    do
        input #1, temp
        if temp = chr(20) then 
            zahl = val(wert)
            wert = ""
            exit do
        else
            wert = wert + temp
        end if
    loop
    kont = 0
    locate count,1
    print zahl
    count = count + 1
    if count = 20 then count = 0
    sleep 1
Loop Until Inkey$ = Chr$(27)                      ' exit with esc key

close #1
End


MfG Sippo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz