Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 17.11.2010, 23:10 Titel: Auswerung von RS232 - Signalen |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 17.11.2010, 23:59 Titel: |
|
|
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 |
|
 |
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 110
|
Verfasst am: 18.11.2010, 01:06 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 18.11.2010, 01:30 Titel: |
|
|
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 18.11.2010, 18:00 Titel: |
|
|
CRLF? was ist das denn? wenn das was bringt wenn man diese Buchstaben sendet wäre das auch kein Problem
MfG Sippo |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 18:07 Titel: |
|
|
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 18.11.2010, 18:10 Titel: |
|
|
Achso , ok
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 18:15 Titel: |
|
|
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 18.11.2010, 18:19 Titel: |
|
|
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
MfG Sippo
Edit: gefunden: VAL  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 18:59 Titel: |
|
|
Ä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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 18.11.2010, 19:18 Titel: |
|
|
ja der unterschied ist mir schon klar, deshalb will ichs ja umformen
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 18.11.2010, 20:08 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 20:43 Titel: |
|
|
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 |
|
 |
Andy19312
Anmeldungsdatum: 22.10.2005 Beiträge: 428
|
Verfasst am: 18.11.2010, 20:46 Titel: |
|
|
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 21:06 Titel: |
|
|
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?
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 |
|
 |
Andy19312
Anmeldungsdatum: 22.10.2005 Beiträge: 428
|
Verfasst am: 18.11.2010, 21:18 Titel: |
|
|
alla so?
if mid(wert,len(wert),1) = chr(32) then ? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 21:19 Titel: |
|
|
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 |
|
 |
Andy19312
Anmeldungsdatum: 22.10.2005 Beiträge: 428
|
Verfasst am: 18.11.2010, 21:21 Titel: |
|
|
jepp
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 18.11.2010, 21:36 Titel: |
|
|
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 ...
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 |
|
 |
Sippo

Anmeldungsdatum: 17.04.2008 Beiträge: 125
|
Verfasst am: 21.11.2010, 15:19 Titel: |
|
|
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 |
|
 |
|