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:

rs232-struktur von purebasic umsetzen nach freebasic

 
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
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.10.2007, 09:31    Titel: rs232-struktur von purebasic umsetzen nach freebasic Antworten mit Zitat

hallo, ich kann diese struktur von purebasic für die serielle schnittstelle nach freeebasic nicht umsetzen.
dieser code spricht die serielle schnittstelle an.

wer kann das mal ansatzweise mit umsetzen. verstehe teileweise die sogenannten zeiger usw nicht.

mfg

Code:

Declare   ResetDTR(hCom.l)
Declare   SetDTR(hCom.l)
Declare   ResetRTS(hCom.l)
Declare   SetRTS(hCom.l)
Declare   ResetTXD(hCom)
Declare   SetTXD(hCom.l)
Declare.l GetCTS(hCom.l)
Declare.l GetDSR(hCom.l)
Declare.l GetRING(hCom.l)
Declare.l GetRLSD(hCom.l)
Declare   SendChar(hCom.l, Wert.l)
Declare.l ReadChar(hCom.l)
Declare.l OpenCom(Nr.l, Baud.l, Bits.b, Stop.b, Parity.b)
Declare   CloseCom(hCom.l)

Structure ComDCB
     DCBlength.l
     BaudRate.l
     fBinary.l
     fParity.l
     fOutxCtsFlow.l
     fOutxDsrFlow.l
     fDtrControl.l
     fDsrSensitivity.l
     fTXContinueOnXoff.l
     fOutX.l
     fInX.l
     fErrorChar.l
     fNull.l
     fRtsControl.l
     fAbortOnError.l
     fDummy2.l
     wReserved.w
     XonLim.w
     XoffLim.w
     ByteSize.b
     Parity.b
     StopBits.b
     XonChar.b
     XoffChar.b
     ErrorChar.b
     EofChar.b
     EvtChar.b
     wReserved1.w
EndStructure

Name.s = "Com2"

hCom.l = OpenCom(2,19200,8,#ONESTOPBIT, #NOPARITY)
If hCom > #INVALID_HANDLE_VALUE
     ResetDtR(hCom)
     SetRTS(hCom)
     Delay(1000)
     ResetRTS(hCom)
     Delay(1000)
          Text.s = ""
          Zeichen.l = ReadChar(hCom)
          Repeat
            Zeichen.l = ReadChar(hCom)
          Until zeichen=13 
          For a=0 To 25
            Zeichen.l = ReadChar(hCom)
            Debug Chr(zeichen)
          Next   
      CloseHandle_(hCom)
EndIf
End

Procedure ResetDTR(hCom.l)
     Status.l = #CLRDTR
     EscapeCommFunction_ (hCom, Status)
EndProcedure

Procedure SetDTR(hCom.l)
     Status.l = #SETDTR
     EscapeCommFunction_ (hCom, Status)
EndProcedure

Procedure ResetRTS(hCom.l)
     Status.l = #CLRRTS
     EscapeCommFunction_ (hCom, Status)
EndProcedure

Procedure SetRTS(hCom.l)
     Status.l = #SETRTS
     EscapeCommFunction_ (hCom, Status)
EndProcedure

Procedure ResetTXD(hCom.l)
     Status.l = #CLRBREAK
     EscapeCommFunction_ (hCom, Status)
EndProcedure

Procedure SetTXD(hCom.l)
     Status.l = #SETBREAK
     EscapeCommFunction_ (hCom, Status)
EndProcedure

Procedure.l GetCTS(hCom.l)
     ModemStatus.l = 0
     GetCommModemStatus_ (hCom, @ModemStatus)
     If ModemStatus & #MS_CTS_ON = #MS_CTS_ON
          ProcedureReturn 1
     Else
          ProcedureReturn 0
     EndIf
EndProcedure

Procedure.l GetDSR(hCom.l)
     ModemStatus.l = 0
     GetCommModemStatus_ (hCom, @ModemStatus)
     If ModemStatus & #MS_DSR_ON = #MS_DSR_ON
          ProcedureReturn 1
     Else
          ProcedureReturn 0
     EndIf
EndProcedure

Procedure.l GetRING(hCom.l)
     ModemStatus.l = 0
     GetCommModemStatus_ (hCom, @ModemStatus)
     If ModemStatus & #MS_RING_ON = #MS_RING_ON
          ProcedureReturn 1
     Else
          ProcedureReturn 0
     EndIf
EndProcedure

Procedure.l GetRLSD(hCom.l)
     ModemStatus.l = 0
     GetCommModemStatus_ (hCom, @ModemStatus)
     If ModemStatus & #MS_RLSD_ON = #MS_RLSD_ON
          ProcedureReturn 1
     Else
          ProcedureReturn 0
     EndIf
EndProcedure

Procedure SendChar(hCom.l, Wert.l)
     Anzahl.l = 0
     Menge.l = 1
     WriteFile_ (hCom, @Wert, Menge, @Anzahl, 0)
     ProcedureReturn Anzahl
EndProcedure

Procedure.l ReadChar(hCom.l)
     Wert.l = 0
     Anzahl.l = 0
     Status.l = 0
     GetCommMask_ (hCom, @Status)
     If Status And #EV_RXCHAR = #EV_RXCHAR
          ReadFile_ (hCom, @Wert, 1, @Anzahl, 0)
          If Anzahl
               ProcedureReturn Wert
          Else
               ProcedureReturn -1
          EndIf
     Else
          ProcedureReturn -1
     EndIf
EndProcedure

Procedure.l OpenCom(Nr.l, Baud.l, Bits.b, Stop.b, Parity.b)
     MyDCB.ComDCB
     Name.s = "Com" + StrU(Nr,#Byte)
     MyDCB\DCBlength = SizeOf(ComDCB)
     MyDCB\BaudRate = Baud
     MyDCB\fBinary = #True
     MyDCB\fParity = #False
     MyDCB\fOutxCtsFlow = #False
     MyDCB\fOutxDsrFlow = #False
     MyDCB\fDtrControl = #DTR_CONTROL_DISABLE
     MyDCB\fDsrSensitivity = #False
     MyDCB\fTXContinueOnXoff = #True
     MyDCB\fOutX = #False
     MyDCB\fInX = #False
     MyDCB\fErrorChar = 0
     MyDCB\fNull = #False
     MyDCB\fRtsControl = #RTS_CONTROL_DISABLE
     MyDCB\fAbortOnError = #False
     MyDCB\XonLim = 4096
     MyDCB\XoffLim = 4096
     MyDCB\ByteSize = Bits
     MyDCB\Parity = Parity
     MyDCB\StopBits = Stop
     MyDCB\XoffChar = $3F
     MyDCB\ErrorChar = 0
     MyDCB\EofChar = 0
     MyDCB\EvtChar = 0
     hCom.l = CreateFile_ (@Name, #GENERIC_READ | #GENERIC_WRITE, 0, 0, #OPEN_EXISTING, 0, 0)
     If hCom = #INVALID_HANDLE_VALUE
          ProcedureReturn -1
     EndIf
     If GetCommState_(hCom, @MyDCB) = 0
          ProcedureReturn -1
     EndIf
     If SetupComm_ (hCom, 4096, 4096) = 0
          ProcedureReturn -1
     EndIf
     If SetCommState_ (hCom, @MyDCB) = 0
          ProcedureReturn -1
     EndIf
     Status.l = #EV_CTS | #EV_DSR | #EV_RING | #EV_RLSD | #EV_RXCHAR
     If SetCommMask_ (hCom, Status) = 0
          ProcedureReturn -1
     EndIf
     ProcedureReturn hCom
EndProcedure

Procedure CloseCom(hCom.l)
     CloseHandle_(hCom)
EndProcedure
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolfi30



Anmeldungsdatum: 17.08.2007
Beiträge: 38

BeitragVerfasst am: 07.10.2007, 16:55    Titel: Antworten mit Zitat

Hallo,

wo sind da Zeiger? Die Struktur beinhaltet nur integer-,short- und byte Variablen! Zeigerhandling in Purebasic ist miserabel zu handhaben, hab mir das Paket vor 4 Jahren mal gekauft. In deinem Fall wird nur an manchen Stellen(@-Operator) die Adresse anstatt der Wert übergeben sonst nichts. In Freebasic wird dafür auch der @-Operator benutzt.

Gruß Wolfi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.10.2007, 17:59    Titel: Antworten mit Zitat

was sind da sfür werte :
#ONESTOPBIT, #NOPARITY
wo erhalte ich die in freebasic?

wie wird so etwas in freebasic gehandhabt :

MyDCB.ComDCB
Name.s = "Com" + StrU(Nr,#Byte)
MyDCB\DCBlength = SizeOf(ComDCB)
MyDCB\BaudRate = Baud
MyDCB\fBinary = #True
MyDCB\fParity = #False

oder so etwas :

Structure ComDCB
DCBlength.l
BaudRate.l
fBinary.l
fParity.l
....
....
EndStructure
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolfi30



Anmeldungsdatum: 17.08.2007
Beiträge: 38

BeitragVerfasst am: 07.10.2007, 18:18    Titel: Antworten mit Zitat

Hallo,

#ONSTOPBIT und #NOPARITY sind Konstanten!
Die Werte müssten in der Deklaration enthalten sein, mal nachschauen in der Purebasic-Header!

Kann man in Freebasic z.b mit #Define ONSTOPBIT Wert oder
const ONSTOPBIT=Wert deklarieren

MyDCB.ComDCB wird in Freebasic mit DIM MyDCB as ComDCB angelegt
Aus MyDCB\DCBlength wird MyDCB.DCBlength

Structure ComDCB (type ComDCB)
DCBlength.l (as integer DCBlength)
BaudRate.l (as integer BaudRate)
fBinary.l
fParity.l
....
....
EndStructure (end type)

In Klammer ist die Anweisung wie man es in Freebasic handhabt.

Ich hoffe die Angaben sind eine kleine Hilfe für dich

Gruß wolfi
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.10.2007, 18:50    Titel: Antworten mit Zitat

jup, danke erstmal.

werde es mal umsetzen.

ich melde mich dann mal wieder, wenn ich hilfe brauche für diese rs232-schnittstelle.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 07.10.2007, 20:59    Titel: Antworten mit Zitat

Alle Konstanten sowie auch 'Type DCB' ist in winbase.bi definiert, brauchst du nicht nochmal definieren
Code:
Dim MyDCB As DCB
reicht.
siehe hier: http://forum.qbasic.at/viewtopic.php?p=66827#66827

Code:
#INCLUDE ONCE "windows.bi"

...

'DECLARE.l OpenCom(Nr.l, Baud.l, Bits.b, STOP.b, Parity.b)
DECLARE Function OpenCom(Nr As DWord, Baud As DWord, Bits As Byte, StopBits As Byte, Parity As Byte) As Any Ptr  'Stop ist Basicanweisung deshalb StopBits
'DECLARE   CloseCom(hCom.l)
DECLARE Sub  CloseCom(hCom as HANDLE)

...

'NAME.s = "Com2"
Dim As String sNAME= "Com2"  'NAME ist Basicanweisung deshalb sNAME
'hCom.l = OpenCom(2,19200,8,#ONESTOPBIT, #NOPARITY)
Dim as HANDLE hCom = OpenCom(2,19200,8, ONESTOPBIT, NOPARITY)

...
usw.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.10.2007, 23:32    Titel: Antworten mit Zitat

jup, das wird ja immer schöner und besser.
danke.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 08.10.2007, 00:07    Titel: Antworten mit Zitat

habe die werte von purebasic jetzt nach den obigen vorschlägen umgesetzt. man kann die serielle schnittstelle nutzen mit den eigenen feinen einstellungen die man braucht.
alle werte oben aus dem purebasic-source kann man einsetzen.

sehr gut zum erweitern und testen für den eigenen gebrauch :
Code:

#include once "windows.bi"
#include once "fbgfx.bi"     

Screen 19,16

Declare sub open_com()
Declare sub close_com()
Declare Sub Reset_DTR()
Declare sub Set_RTS()
Declare sub Reset_RTS()
Declare sub ReadChar()
Declare sub SendChar()
 
Dim Shared dcb As DCB
Dim Shared hCom As handle
Dim Shared commPort As String
Dim Shared status As Integer
Dim Shared anzahl As Integer
Dim Shared wert As integer
Dim Shared menge As integer
Dim Shared teststring As String

   commport = "COM2"

   open_com
   Sleep 100
       
   do
     ReadChar
     If wert>32 then     
           teststring=teststring+Chr(wert)
           Sleep 5
     End if      
   Loop Until wert=13
       
   close_Com
   Print teststring
   
   sleep

End

sub ReadChar()
     Anzahl = 0
     Status = 0
     menge=1
     GetCommMask (hCom, @Status)
     If Status And EV_RXCHAR = EV_RXCHAR then
           ReadFile (hCom, @Wert, menge, @Anzahl, 0)
     End if             
End Sub

sub SendChar()
     Anzahl = 0
     Menge= 1
     WriteFile (hCom, @Wert, Menge, @Anzahl, 0) 
End sub

sub Reset_RTS()
     Status = CLRRTS
     EscapeCommFunction (hCom, Status)
End sub

Sub Reset_DTR()
     Status = CLRDTR
     EscapeCommFunction (hCom, Status)
End Sub

sub Set_RTS()
     Status = SETRTS
     EscapeCommFunction (hCom, Status)
End Sub

sub close_Com()
     CloseHandle(hCom)
End sub

sub open_com()
   
    hCom = CreateFile( commPort,_
                       GENERIC_READ Or GENERIC_WRITE,_
                       0,_
                       NULL,_
                       OPEN_EXISTING,_
                       0,_
                       NULL )
                       
    Status = EV_CTS or EV_DSR or EV_RING or EV_RLSD or EV_RXCHAR
   
    dcb.BaudRate = CBR_19200           
    dcb.ByteSize = 8                   
    dcb.Parity = NOPARITY               
    dcb.StopBits = ONESTOPBIT           
    dcb.fBinary = True
    dcb.Parity = False
    dcb.fOutxCtsFlow = False
    dcb.fOutxDsrFlow = False
    dcb.fDtrControl = DTR_CONTROL_DISABLE
    dcb.fDsrSensitivity = False
    dcb.fTXContinueOnXoff = True
    dcb.fOutX = False
    dcb.fInX = False
    dcb.ErrorChar = 0
    dcb.fNull = False
    dcb.fRtsControl = RTS_CONTROL_DISABLE
    dcb.fAbortOnError = False
    dcb.XonLim = 255
    dcb.XoffLim = 255
    dcb.XoffChar = 63
    dcb.ErrorChar = 0
    dcb.EofChar = 0
    dcb.EvtChar = 0
     
    If SetCommState(hCom, @dcb) = 0 Then
        Print " ...ist nicht... ";GetLastError()
        Exit sub
    Endif
   
    Print "Serieller Port ";commPort;" ist offen !"
   
End sub
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