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:

Serielle Schnittstelle abfragen mit QB45
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 31.03.2015, 14:36    Titel: Serielle Schnittstelle abfragen mit QB45 Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 31.03.2015, 14:50    Titel: Antworten mit Zitat

Hallo,
das machst man mit Val(StrVar$).
siehe hierhttp://www.freebasic-portal.de/befehlsreferenz/val-149.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 31.03.2015, 19:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 31.03.2015, 20:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

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

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
Benutzer-Profile anzeigen Private Nachricht senden
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 01.04.2015, 08:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 01.04.2015, 10:24    Titel: Antworten mit Zitat

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
Code:

PRINT WERT$;

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]
Code:
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 01.04.2015, 12:33    Titel: Antworten mit Zitat

Hallo Maxx, und willkommen im Forum! lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 83

BeitragVerfasst am: 01.04.2015, 14:16    Titel: Antworten mit Zitat

Oder so:

Code:
...
IF (WERT$ = "25") then Print "ACHTUNG"
...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 01.04.2015, 14:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 01.04.2015, 15:07    Titel: Antworten mit Zitat

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 lächeln
------------------------------------------------------------------------
Danke für Eure Mühe Maxx
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 01.04.2015, 16:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2457
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 01.04.2015, 20:50    Titel: Antworten mit Zitat

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
Code:
PRINT ASC(Wert$)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 02.04.2015, 01:36    Titel: Antworten mit Zitat

@Maxx: Laut deinem ersten Posting liest du die Zeichen mit
Code:
PRINT INPUT$(1,#1)
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
Benutzer-Profile anzeigen Private Nachricht senden
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 02.04.2015, 13:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 02.04.2015, 13:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 02.04.2015, 13:58    Titel: Antworten mit Zitat

Alles klar. Danke
Maxx
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 02.04.2015, 23:35    Titel: Antworten mit Zitat

Entschuldigung, ich hätte das Sniplet noch kommentieren sollen (ich habe das inzwischen nachgeholt, s.o. lächeln ), 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
Benutzer-Profile anzeigen Private Nachricht senden
Maxx



Anmeldungsdatum: 31.03.2015
Beiträge: 7

BeitragVerfasst am: 12.04.2015, 17:03    Titel: serielle Schnittstelle auf H oder L abfragen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 12.04.2015, 18:44    Titel: Antworten mit Zitat

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
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 QBasic. 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