 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.10.2007, 09:31 Titel: rs232-struktur von purebasic umsetzen nach freebasic |
|
|
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 |
|
 |
Wolfi30
Anmeldungsdatum: 17.08.2007 Beiträge: 38
|
Verfasst am: 07.10.2007, 16:55 Titel: |
|
|
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 |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.10.2007, 17:59 Titel: |
|
|
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 |
|
 |
Wolfi30
Anmeldungsdatum: 17.08.2007 Beiträge: 38
|
Verfasst am: 07.10.2007, 18:18 Titel: |
|
|
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 |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.10.2007, 18:50 Titel: |
|
|
jup, danke erstmal.
werde es mal umsetzen.
ich melde mich dann mal wieder, wenn ich hilfe brauche für diese rs232-schnittstelle. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 07.10.2007, 20:59 Titel: |
|
|
Alle Konstanten sowie auch 'Type DCB' ist in winbase.bi definiert, brauchst du nicht nochmal definieren
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 |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 07.10.2007, 23:32 Titel: |
|
|
jup, das wird ja immer schöner und besser.
danke.
mfg |
|
Nach oben |
|
 |
atari gesperrt
Anmeldungsdatum: 26.08.2007 Beiträge: 144
|
Verfasst am: 08.10.2007, 00:07 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|