Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 31.03.2015, 14:36 Titel: Serielle Schnittstelle abfragen mit QB45 |
|
|
Hallo,
ich habe eine kleine µP- Platine an der com1 dran.
Diese schickt mir dieTemperatur als Zahlenwerte. Ich kann sie empfangen und sehe die Zahlenwerte.
Nun möchte ich bei einem bestimmten Zahlenwert das ein akustisches Signal (beep) ausgelöst wird.
Wie kann ich aus dem Input$ eine Zahl "formen"?
Mein Code- Stück ist:
Open "com1:9600,n,8,1,RS,DS,CS" For RANDOM AS #1
Do
PRINT INPUT$(1,#1)
>>>> IF Input- Wert = 25 then........beep
>>>>else.......
Loop
Danke im Voraus Maxx |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
|
Nach oben |
|
|
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 31.03.2015, 19:37 Titel: |
|
|
Hallo Elor,
danke für die schnelle Antwort.
Muß aber nochmals nachfragen:
if Val(StrVar$) = 25 then Beep oder Color 14,2
müßte doch stimmen?
Wird der "Beep" nur über den internen Lautsprecher abgespielt?
Gibt es noch eine andere Möglichkeit- Soundkarte?
Habe "Color..." nur eingefügt ob etwas passiert, aber es verändert sich
schon ab Zählschritt 2 die Hintergrundfarbe.
Die Zahlen werden auch vertikal geschrieben. Kann man das ändern?
Wo liegt mein Fehler?
Danke und schönen Abend Maxx |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 31.03.2015, 20:30 Titel: |
|
|
Also, ich wuerde meiner Variable erst mal einen Namen Spendieren der auf ihren inhalt hindeutet, in deinem fall also Temperatur(VarStr$ ist frei erfunden).
Dann musst Du dieser Variable den Wert zuweisen der vom COM-Geraet eingelesen wird. Erst dann kannst Du in Pruefen mit:
Code: |
Temperatur$ = Input$(deinecomnummer)
if(Temperatur$ = 25) then mach was...
|
Was den BEEPer angeht, hab ich keine ahnung mit was der Ausgegeben wird(hab keinen Internen Lautsprecher in meiner Kiste). Da sich in meinen Lautsprecherboxen aber nix tut, geh ich mal davon aus. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
Verfasst am: 31.03.2015, 20:43 Titel: |
|
|
Zitat: | Die Zahlen werden auch vertikal geschrieben. Kann man das ändern? |
Nach jedem PRINT wird ein Zeilenumbruch geschrieben, d. h. jede Ausgabe findet in einer neuen Zeile statt. Willst du das nicht, dann kannst du den Zeilenumbruch durch einen Strichpunkt am Ende der PRINT-Zeile unterdrücken:
Code: | PRINT INPUT$(1,#1); |
Sobald du eine neue Zeile haben willst, reicht ein einfaches PRINT ohne weiteres Argument.
Ich glaube, dass BEEP in QB noch über den Speaker ausgegeben wird; FreeBASIC lässt dann schon über ein Systemereignis des Betriebssystems ausgeben (kann aber vielleicht systemabhängig sein). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 01.04.2015, 08:47 Titel: |
|
|
Hallo,
also "Beep" geht wirlich nur über den internen PC- Lautsprecher.
Habe ich gelesen.
Mein Code schreibt jetzt nebeneinander (danke!) aber es kommt ne' neue Meldung: unverträgliche Datentypen (?)
OPEN "com1:9600,n,8,1,RS,DS,CS" FOR RANDOM AS #1
DO
PRINT INPUT$(1,#1)
WERT$ = INPUT$(com1)
IF (WERT$ = 25) then Print "ACHTUNG"
LOOP
Was ist nur noch falsch ?
Grüße Maxx |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 01.04.2015, 10:24 Titel: |
|
|
Maxx hat Folgendes geschrieben: |
Code: |
OPEN "com1:9600,n,8,1,RS,DS,CS" FOR RANDOM AS #1
DO
PRINT INPUT$(1,#1)
WERT$ = INPUT$(com1)
IF (WERT$ = 25) then Print "ACHTUNG"
LOOP
|
Was ist nur noch falsch ?
Grüße Maxx |
Du kannst den Eingabebuffer nicht zweimal hintereinander einlesen.
Zuerst
Code: |
WERT$ = INPUT$(1, %1)
|
und dann
Die Temperatur liegt ja nicht nur im bereich 0..9 sondern mindestends im bereich 0..99. Das bedeutet aber auch das das einlesen eines einzellnen Bytes b.z.w Charakters nicht ausreicht um die Zahl zu Speichern. Das gilt aber nur, wenn der Wert als ASCII-Zeichen Empfangen wird. Ich wuerde das so machen:
Code: |
'pruefen, ob Zeichen im Empfangspuffer
IF NOT EOF(hFile) THEN
' nur lesen wenn was drin steht
WERT$ = INPUT$(LOC(hFile), hFile)
END IF
|
Damit werden alle Zeichen aus dem Empfangspuffer geleert.
(Das duerfte auch der grund gewessen sein, weshalb sich die Farbe vorher schon bei dem wert 2 geaendert hat).
Falls du mehr ueber EOF und LOC wissen willst, geh auf den von mir gePosteten link oder verwende die (Q)uickBASIC-Hilfe in deiner IDE.
Wenn man mehr Code gesehen haette waehre besser gewessen.
[/code] |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1213 Wohnort: Ruhrpott
|
Verfasst am: 01.04.2015, 12:33 Titel: |
|
|
Hallo Maxx, und willkommen im Forum!
WERT$ = 25 gibt einen Type mismatch error, weil WERT$ eine Stringvariable und 25 eine (Integer-) Zahl ist. Du mußt vor dem Vergleich den Variableninhalt mit Val(Wert$) in eine Zahl konvertieren, also Code: | ...
IF (Val(WERT$) = 25) then Print "ACHTUNG"
... |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 01.04.2015, 14:16 Titel: |
|
|
Oder so:
Code: | ...
IF (WERT$ = "25") then Print "ACHTUNG"
... |
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.04.2015, 14:24 Titel: |
|
|
Maxx hat Folgendes geschrieben: | also "Beep" geht wirlich nur über den internen PC- Lautsprecher.
Habe ich gelesen. |
Dann hast du irgendwas ziemlich Altes gelesen, Schon seit Windows-9x-Zeiten erzeugt Beep einfach den entsprechenden Systemklang, wenn man das Programm unter Windows ausführt. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 01.04.2015, 15:07 Titel: |
|
|
Hallo,
danke für die Erklärungen.
Ich habe es immer noch nicht geschafft.
Mir ist klar, dass ich mehre Daten empfange und das ich den Puffer leeren muß.
Ich möchte aber jetzt nur prüfen ob ein best. Wert (hier 25) überschritten wird.
Hierauf soll abgefragt werden und auch reagiert werden.
So nach dem Prinzip:
If Wert 25 then Beep oder Color...
Ich kann Wert$ nicht abfragen--> Fehlermeldung Missmatch...
Frage: Wie kann ich Wert$ so verwandeln, dass ich o.g. Abfrage stellen kann.
IF (WERT$ = "25") then Print "ACHTUNG" --geht auch nicht !
____________________________________________________
Sound geht jetzt doch., habe die Soundkarte neu installiert
------------------------------------------------------------------------
Danke für Eure Mühe Maxx |
|
Nach oben |
|
|
Elor
Anmeldungsdatum: 12.07.2013 Beiträge: 205 Wohnort: Konstanz
|
Verfasst am: 01.04.2015, 16:35 Titel: |
|
|
Code: |
Wert$ = "25"
IF (Wert$ = "25") THEN PRINT "Wert ist "; Wert$
' oder
IF (VAL(Wert$) = 25) THEN PRINT "Wert ist "; Wert$
Wert% = VAL(Wert$) 'Umwandeln in Integer
PRINT Wert%
|
Wenn das bei Dir Funktioniert, ist in deinem Programm was anderes Faul. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.04.2015, 20:50 Titel: |
|
|
Artikel aus meiner Sammlung:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/SerielleKommunikation.html
Ansonsten zum Ganzen: Zuallererst einmal das Protokoll kennen, und zwar auf Byte-Ebene. => In einem ersten Versuch lasse also wie von den andern gezeigt Byte für Byte lesen und gib sie mit
einmal aus. Ebenso muss natürlich definiert sein, ob Du der Platine einen "Befehl" mit PRINT# schicken musst oder ob sich von sich aus Dir regelmässig Bytes sendet. In letzterem Fall lass einfach einmal ein Hexdump-Terminal laufen.
Sobald der exakte Protokollaufbau klar ist (und erst dann), lässt sich das von Dir Gewünschte realisieren. Aber ich rate Dir auch hier, in einem ersten Zwischenschritt erst nur einmal die Temperatur ausgeben zu lassen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1213 Wohnort: Ruhrpott
|
Verfasst am: 02.04.2015, 01:36 Titel: |
|
|
@Maxx: Laut deinem ersten Posting liest du die Zeichen mit ein. Dieser Befehl liest explizit immer nur ein Byte von der Schnittstelle, somit kann Wert$ niemals den Inhalt "25" haben (weil 2 Zeichen lang). Und weil du schreibst, daß du die Werte empfangen und sehen kannst, sendet die Platine die Temperatur möglicherweise als einfachen Byte-Wert. Versuche es also mal mit Code: | If (Asc(Wert$) = 25) Then... |
Außerdem liefert die Zeile Code: | WERT$ = INPUT$(com1) | immer einen Leerstring zurück. "com1" suggeriert zwar, daß hier von der Schnittstelle gelesen wird, der Interpreter betrachtet diesen Wert aber als Single-Variable mit dem Wert 0 (Ein Nachteil der impliziten Variablendeklaration bei QBasic). Das heißt, der INPUT$ - Befehl liest hier 0 Zeichen von der Tastatur - also einen Leerstring.
Ansonsten schließe ich mich der Empfehlung von dreael an: Analysiere zuerst einmal den Datenstrom, und überlege danach, wie du weiter vorgehen willst.
Gruß
grindstone
EDIT:
Versuch mal das hier: Code: | Open "com1:9600,n,8,1,RS,DS,CS" For Random As #1
Do
WERT$ = "" 'vorherige ausgabe löschen
Do 'einen wert einlesen
C$ = Input$(1,#1) 'ein byte von der schnittstelle holen
If (C$ = Chr$(13)) Or (C$ = Chr$(10)) Then 'auf zeilenende testen
Exit Do 'wenn zeilenende --> schleife verlassen
EndIf
WERT$ = WERT$ + C$ 'eingelesenes byte an ausgabestring anhängen
Loop
Print WERT$ 'ausgabewert auf bildschirm
If (Val(WERT$) >= 25) Then Print "ACHTUNG" 'auf grenzwert testen und warnmeldung ausgeben
Loop |
_________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Zuletzt bearbeitet von grindstone am 02.04.2015, 23:19, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 02.04.2015, 13:06 Titel: |
|
|
Hallo,
es klappt. Also ich bin jetzt (dank Eurer Hilfe) in der Lage den genauen
Wert vom Modul auszulesen und auch auf bzw. ab einem bestimmten Wert eine Reaktion auszulösen.
Mir fehlen noch etwas die Hintergründe .Werde noch die TuTs
lesen. Nachfolgende Zeile ist noch unklar:
If (C$ = Chr$(13)) Or (C$ = Chr$(10))
"Wenn eingelesener String.....? oder eingelesener String...?"
Würde mich über eine kurze Erklärung freuen.
Ich wünsche Euch ein frohes Osterfest und bedanke mich für die Hilfe!
Grüsse Maxx |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
Verfasst am: 02.04.2015, 13:44 Titel: |
|
|
Code: | If (C$ = Chr$(13)) Or (C$ = Chr$(10)) THEN |
Es handelt sich hier um die ASCII-Zeichen, die üblicherweise für einen Zeilenumbruch verwendet werden: CHR(10) für ein line feed LF (Zeilenvorschub) und CHR(13) für ein carriage return CR (Wagenrücklauf). Je nach System werden aber das eine oder andere oder auch beide Zeichen zusammen verwendet; deswegen wird hier einfach mal auf beides getestet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 02.04.2015, 13:58 Titel: |
|
|
Alles klar. Danke
Maxx |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1213 Wohnort: Ruhrpott
|
Verfasst am: 02.04.2015, 23:35 Titel: |
|
|
Entschuldigung, ich hätte das Sniplet noch kommentieren sollen (ich habe das inzwischen nachgeholt, s.o. ), aber ich war gerade etwas knapp an Zeit. Wenn das Modul nach jedem Messwert ein CR und/oder LF ausgibt, müsste auch diese etwas einfachere Variante funktionieren: Code: | Open "com1:9600,n,8,1,RS,DS,CS" For Binary As #1
Do
Line Input #1,WERT$
Print WERT$
If (Val(WERT$) >= 25) Then Print "ACHTUNG"
Loop |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Maxx
Anmeldungsdatum: 31.03.2015 Beiträge: 7
|
Verfasst am: 12.04.2015, 17:03 Titel: serielle Schnittstelle auf H oder L abfragen |
|
|
Hallo,
ich habe wiedermal eine Frage, wo ich gern Eure Hilfe hätte.
Also: Was bzw wie muss ich meine Text (der gut klappt) aendern, wenn ich nur abfragen
will ob an der Buchse ein H- Pegel oder ob ein L- Pegel anliegt.(Schaltkontakt)
Der absolute Wert ist nicht interessant.
Voraus dankend
Maxx |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1213 Wohnort: Ruhrpott
|
Verfasst am: 12.04.2015, 18:44 Titel: |
|
|
Das dürfte nicht so einfach sein. Welchen Pin genau möchtest du abfragen? Für alle Pins außer RxD und TxD gibt es WinApi-Funktionen. Ansonsten könntest du versuchen, mithilfe von inpout32 auf das entsprechende Register des COM-Ports zuzugreifen. Siehe dazu diesen Beitrag (ganz durchlesen).
Die Grundadressen der COM-Ports lauten:
- com1: &h03f6
- com2: &h02f8
- com3: &h03e8
- com4: &h02e8
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|