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:

Ascii string einlesen

 
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
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 17.02.2011, 15:16    Titel: Ascii string einlesen Antworten mit Zitat

Hallo!

Ein Mikrokontroller schickt mir einen Temperaturwert als ASCII string
über COM1 in den PC. Das funktioniert in QB perfekt:

temperatur.uebertragen:
OPEN "com1:4800,N,8,1,TB32,RS,OP,CD0,DS0" FOR RANDOM AS #1
DO
IF LOC(1) > 0 THEN
y$ = INPUT$(1, 1)
IF y$ = "#" THEN GOTO w1: 'liest solange, bis am Schluss das Zeichen # gesendet wird.
PRINT y$;
Temp$ = Temp$ + y$
END IF
LOOP
w1:
close #1

(OPEN COM .... ist hier wahrscheinlich nicht ideal/zu lange, aber so hats endlich funktioniert und dann drehe ich nicht mehr daran herum)

Kann mir das bitte, bitte, bitte jemand in FreeBasic übersetzen, bevor ich mir einen Strick suche?
Dann komme ich wieder alleine weiter.
Habe FBIde 0.4.6.

lg
Triti
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 17.02.2011, 18:17    Titel: Antworten mit Zitat

Viel zu übersetzen gibt es ja nicht; Suffixe gibt es nicht mehr und das y$ bzw. Temp$ musst du entsprechend DIMen, und das GOTO lässt sich auch leicht vermeiden.
Code:
OPEN "com1:4800,N,8,1,TB32,RS,OP,CD0,DS0" FOR RANDOM AS #1
DIM AS STRING y, Temp
DO
  IF LOC(1) > 0 THEN
    y = INPUT (1, #1)
    IF y = "#" THEN EXIT DO 'liest solange, bis am Schluss das Zeichen # gesendet wird.
    PRINT y;
    Temp = Temp + y
  END IF
LOOP
close #1

Sollte funktionieren, ist aber nicht getestet.
Wobei ich wohl eher FOR BINARY statt FOR RANDOM nehmen würde. Oder sogar FOR INPUT, da du ja nur einliest.
_________________
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
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.02.2011, 21:29    Titel: Antworten mit Zitat

Hallo,

funktioniert es vielleicht so?
Code:
Declare Function TemperaturUebertragen() As String

Dim Ergebnis As String
Ergebnis = TemperaturUebertragen()
Sleep
End



Function TemperaturUebertragen() As String
    Dim As String temp, y
    Dim As Integer f = FreeFile
    y = Space(1)
    If (Open Com ( "com1:4800,N,8,1,TB32,RS,OP,CD0,DS0" For Binary As #f ) <> 0 ) Then
        Print "Fehler. Der Port konnte mit den Einstellungen nicht geoeffnet werden."
        Sleep: End 1
    End If
    DO
        IF LOC(f) > 0 THEN
            GET #f, , y
            IF y = "#" THEN EXIT DO
            PRINT y;
            Temp += y
        END IF
    LOOP
    close #f
    Return temp
End Function

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 17.02.2011, 23:29    Titel: Antworten mit Zitat

Hallo!

AH! Jetzt kommt endlich keine Fehlermeldung mehr.
Dim As String temp, y war das Geheimnis.

Das könnte klappen. Muss ich am Montag gleich ausprobieren.
Bin mit FB noch ganz am Anfang, über Declare Function und wozu y = Space(1) gut ist muss ich erst lesen. Tutorial ist schon ausgedruckt.

VIELEN DANK !
lg
Triti
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 18.02.2011, 00:17    Titel: Antworten mit Zitat

y = SPACE(1) legt lediglich die Größe des Strings fest; das ist für GET nötig, damit das Programm weiß, wie viel eingelesen werden soll. Alternativ wäre auch DIM y AS STRING*1 möglich.
_________________
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
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 24.02.2011, 12:52    Titel: Antworten mit Zitat

Hallo zusammen!
Es funktioniert lächeln ! Auch wenn ich direkt in die Function keinen Abbruch mit ESC reinkriege oder dass nach 5 Sekunden wenn keine Daten gesendet werden eine Fehlermeldung kommt. Aber das wird schon noch.

-----------------------
Jetzt will ich die Pins einzeln high/low setzen. Da habe ich aber noch einige Fragen zum Beispiel auf www.freebasic-portal.de/porticula/comport-mit-winapi-testen-156.html
Ich kopiere es mal hier her:

#INCLUDE ONCE "windows.bi"
Dim hCom As handle
Dim PortNr As String = "COM1"
Dim modemStat As dword
Cls
'Serielle Schnittstelle öffnen:
hCom = CreateFile(PortNr, GENERIC_READ Or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)

Print PortNr; " geoeffnet ";
Color 15,7 : Print "Handle = "; hCom
Color 4,15 : Print " Ende mit [Esc] "

'Alle Ausgangsleitungen auf positive Spannung setzen:
EscapeCommFunction(hCom, SETRTS) 'RTS +12V
'EscapeCommFunction(hCom, SETDTR) 'DTR +12V
'EscapeCommFunction(hCom, SETBREAK) 'TxD +12V (Break)


Print " CTS = "
Print " DSR = "
Print " RING = "
Print " RLSD = "
'Eingangsleitungen per Polling abfragen:
Do
GetCommModemStatus(hCom, @modemStat)
Locate 3,8 : Print Iif (modemStat And MS_CTS_ON ,1,0)
Locate ,8 : Print Iif (modemStat And MS_DSR_ON ,1,0)
Locate ,8 : Print Iif (modemStat And MS_RING_ON,1,0)
Locate ,8 : Print Iif (modemStat And MS_RLSD_ON,1,0)
Loop Until Inkey = Chr(27)

'Alle Ausgangsleitungen auf negative Spannung zurücksetzen:
EscapeCommFunction(hCom, CLRRTS) 'RTS -12V
EscapeCommFunction(hCom, CLRDTR) 'DTR -12V
EscapeCommFunction(hCom, CLRBREAK) 'TxD -12V

'Serielle Schnittstelle schließen:
closeHandle(hCom)



Dim hCom As handle 'was heisst das?
Dim modemStat As dword 'dword gibts im Index nicht. Was ist modemStat?

Print "Handle = "; hCom 'Bei mir kommt 156 raus. Was sagt das?

EscapeCommFunction(hCom, SETRTS)
'CLRRTS oder SETRTS ist logisch. Woher kommt EscapeCommFunction, und closeHandle ?

Ich habe den Verdacht die werden mit windows.bi eingebunden. Da habe ich natürlich keine Ahnung wie das funktioniert und was dort steht.

Ich will nämlich die beiden Sachen kombinieren mit 2 Ausgangsleitungen zum Mikrokontroller. Die sagen ihm, dass
er jetzt Daten senden soll.
Muss ich also ganz am Anfang die windows.bi laden und hCom, PortNr und modemStat mit DIM definieren
und muss/kann ich dann jedes mal wenn ich dann DTR oder RTS high/low setzen will schreiben:
hCom = CreateFile(PortNr, GENERIC_READ Or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)
EscapeCommFunction(hCom, SETRTS)
sleep 10
EscapeCommFunction(hCom, CLRRTS)
closeHandle(hCom)

also COM öffnen, high, warten, low, schliessen.
Das könnte ich ja in eine SUB_RTSimpuls verpacken.


Ich hoffe das war jetzt nicht zuviel....

lg
Triti
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 25.02.2011, 03:29    Titel: Antworten mit Zitat

Zitat:
Dim hCom As handle 'was heisst das?


hCom wird später mit Hilfe von CreateFile sozusagen ein Zeiger auf den geöffneten COM-Port, bekommt also einen eindeutigen Wert zugewiesen, womit du jederzeit Zugriff auf die serielle Schnittstelle hast.

DWORD ist nichts anderes als ein unsigned integer.
Später im Programm wird mit GetCommModemStatus der aktuelle Status von CTS, DSR etc. abgefragt und mit der "And" jeweils einzeln überprüft:
Code:
GetCommModemStatus(hCom, @modemStat)
Locate 3,8 : Print Iif (modemStat And MS_CTS_ON ,1,0)
Locate ,8 : Print Iif (modemStat And MS_DSR_ON ,1,0)
Locate ,8 : Print Iif (modemStat And MS_RING_ON,1,0)
Locate ,8 : Print Iif (modemStat And MS_RLSD_ON,1,0)


Zitat:
Print "Handle = "; hCom 'Bei mir kommt 156 raus. Was sagt das?
Diese Nummer kann dir vollkommen egal sein. Sie ist, wie schon oben beschrieben, der "eindeutige Schlüssel/Zeiger/Dateinummer" - kannst du nennen, wie du willst - über den du auf den entsprechenden Port zugreifen kannst. Und das machst du über hCom.


Zitat:
EscapeCommFunction(hCom, SETRTS)
'CLRRTS oder SETRTS ist logisch. Woher kommt EscapeCommFunction, und closeHandle ?

Mit EscapeCommFunction setzt du (SETRTS, SETDTR etc.) oder löschst (CLRRTS, ....) du den jeweiligen Pin. Die Funktion kommt, wie du schon richtig vermutest, aus der windows.bi.

Zitat:
Muss ich also ganz am Anfang die windows.bi laden und hCom, PortNr und modemStat mit DIM definieren
und muss/kann ich dann jedes mal wenn ich dann DTR oder RTS high/low setzen will schreiben:
hCom = CreateFile(PortNr, GENERIC_READ Or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)
EscapeCommFunction(hCom, SETRTS)
sleep 10
EscapeCommFunction(hCom, CLRRTS)
closeHandle(hCom)

Ja, das kannst du jedes Mal machen. Port mit CreateFile öffnen,
mit EscapeCommFunction so oft du willst Pins schalten und am Ende mit CloseHandle alles wieder zumachen.

Zitat:
Ich will nämlich die beiden Sachen kombinieren mit 2 Ausgangsleitungen zum Mikrokontroller. Die sagen ihm, dass
er jetzt Daten senden soll.

Das wird wiederum nicht funktionieren. Du würdest ja in diesem Fall den Port doppelt öffnen. Einmal über die FB eigene Open Funktion und dann noch mit CreateFile. An deiner Stelle würde ich alles über die WinAPI machen. Daten lesen kannst du mit ReadFile(), ersetzt dir das "GET #..." in deinem Source. Google-Suche von "readFile function" sollte dich direkt auf den ensprechenden MSDN-Artikel bringen. Schau dir das mal an und wenn du Fragen hast, dann frag. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
triti



Anmeldungsdatum: 23.04.2009
Beiträge: 44

BeitragVerfasst am: 25.02.2011, 14:43    Titel: Antworten mit Zitat

Zitat:
Das wird wiederum nicht funktionieren. Du würdest ja in diesem Fall den Port doppelt öffnen. Einmal über die FB eigene Open Funktion und dann noch mit CreateFile. An deiner Stelle würde ich alles über die WinAPI machen. Daten lesen kannst du mit ReadFile(), ersetzt dir das "GET #..." in deinem Source.

Hm, doppelt geht ja nicht. Ich dachte vielleicht geht es wenn man zuerst open-impuls-close macht und dann den Port mit CreateFile öffnet. Wenn der MC vor dem senden 10mS wartet wäre locker Zeit dass der Port wieder geöffnet wird.
Muss mich dringend über die WinAPI schlau machen. FB ist doch etwas ganz anderes als QB.

Zitat:
Google-Suche von "readFile function" sollte dich direkt auf den ensprechenden MSDN-Artikel bringen. Schau dir das mal an und wenn du Fragen hast, dann frag. lächeln

Danke! Erst mal lesen+denken, dann ausprobieren, dann fragen. lächeln

lg
Triti
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 25.02.2011, 18:58    Titel: Antworten mit Zitat

Als kleine Hilfestellung:
BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);

-hFile: Handle von CreateFile()
-Rest:
Code:
dim as ubyte ptr lpbuf
dim as dword cccbuf, cccread
cccbuf = 1234 ' 1234 bytes sollten gelesen werden (ReadFile kehrt vorher bei synchronen operationen net zurück!)
lpbuf = allocate(cccbuf)

if(FALSE = ReadFile(hHandle, lpbuf, cccbuf, @cccread, NULL)) then
if(ERROR_HANDLE_EOF = GetLastError()) then
print "ende des eingangspuffers erreicht"
endif
endif

Hmm evtl. kehrt ReadFile bei IO-Ops auf Schnittstellen auch sofort zurück, müsste aber vom Modus abhängen (kann man bei CreateFile() angeben)
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
Seite 1 von 1

 
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