Serielle Schnittstelle

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Serielle Schnittstelle

Beitrag von The_Dark_Zim-.- »

Hey Ho
Ich würde gerne die Seriellen Schnittstellen ansprechen. Mit PureBasic 4.1 , aber ich kenn die Befehle nicht und finde auch keine dafür. Wie bzw. wo kann ich mir welche holen. Oder könnte mir jemand die wichtigsten geben :D
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Das wird erst ab Version 4.2 nativ unterstützt.
Dann musst du aber die englische Hilfe installieren, in der deutschen stehen die Befehle glaube ich noch nicht drinne.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Beitrag von The_Dark_Zim-.- »

Ähm es gibt schon 4.2 :o oder ist 4.10 das Höchste, weil ich meinte mit 4.1 eigentlich 4.10 :lol:
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Dazu gibt es aber auch schon genügend Antworten im Forum.

Zuerst Suchen, dann posten!
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

4.20 is allerdings noch Beta, sprich sollte eigentlich nicht im Produktiv-Bereich eingesetzt werden, sondern is halt nur zum Testen.
Deshalb stehen die Befehle auch, wie von HeX0R angemerkt, noch nicht in der deutschen Hilfe drin.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Im produktivem Bereich wird die serielle Schnittstelle wohl eher sehr selten
anzutreffen sein. Die wird doch meist nur noch von Hobbyelektronikern
genutzt.
Die Schnittstelle ist auf immer weniger Mainboards anzutreffen und wird wie
die parallele auch, bald "ganz" verschwinden.
Naja "ganz" verschwinden wird wohl noch dauern, selbst Mainboards mit
ISA-Steckplätzen werden noch gebaut. Aber vom normallen Enduser-Markt
wirds verschwinden.
Und das ist gut so :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Beitrag von The_Dark_Zim-.- »

Hab was gefunden was mir hilft ^^
Hier der Code, fals er euch interessiert :P

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3435&highlight=
; Author: Rings (updated for PB3.93 by ts-soft)
; Date: 14. January 2004
; OS: Windows
; Demo: No

; Small example how to read and receive data over the serial Connector(ComPort)
; with only API's and with a Timer driven non blocking Receiving. 
; I have written this to test a modem and its settings (AT-Hayes-Commands).

; Beispiel zum Senden/Empfangen von Daten über die serielle Schnittstelle.
; Setzt PB Vollversion v3.81+ und Windows vorraus, da einige API's genutzt werden. 


;  ComPort (RS232) example , Write and Read-data, timer driven 
;  good for a small terminal or a modem-configurator 
;  Windows only, done on january, 14th. 2004 
;  Copyright 2004 Siegfried Rings (CodeGuru) 
;
OnErrorGoto(?Errorhandling) ;Enable Errorhandling (enable Linenumbering!) 

;User Structure for all the ComPort-Stuff 
Structure structComport 
  Port.l 
  Inbuffersize.l 
  OutBuffersize.l 
  Handle.l 
  ct.COMMTIMEOUTS 
  dcb.DCB 
  Receivebuffer.l 
  ReceivebufferLength.l 
EndStructure 

Enumeration 
  #Gadget_TextSend 
  #Gadget_TextReceive 
  #Gadget_ButtonSend 
  #Gadget_ButtonReceive 
EndEnumeration 

#Win=1 
#ReceiveSendbuffer=1 
#MaxReceiveBuffer=1024 


Procedure.l SR_OpenComPort(*RS232.structComport) 
  *RS232\Handle =0 
  Device.s="COM"+Str(*RS232\Port)+":" 
  Result = CreateFile_(@Device, $C0000000, 0, 0, 3, 0, 0); create and open a existing device/file ;) 
  If Result = -1 
    MessageRequester("info", "Com Port " + Str(*RS232\Port) + " not available. Use Serial settings (on the main menu) To setup your ports.", 48) 
    ProcedureReturn 0 
  EndIf 
  If Result 
    *RS232\Handle=Result 
    mydcb.DCB 
    If GetCommState_(*RS232\Handle, @mydcb) ;First retrieve the Settings from ComPort 
  
     ;Set Baudrate etc. 
     mydcb\Baudrate=*RS232\dcb\Baudrate ;Change the Settings to our needs 
     mydcb\Bytesize=*RS232\dcb\Bytesize 
     mydcb\Parity=*RS232\dcb\Parity 
     mydcb\StopBits=*RS232\dcb\StopBits 
     Result=SetCommState_(*RS232\Handle, @mydcb) ;and write them back to Comport 
     ;Debug "SetCommState="+Str(result)    
  
     Result=SetCommTimeouts_(*RS232\Handle,*RS232\ct) ;set the Timeouts set longer for problems :) 
     ;Debug "SetCommTimeouts="+Str(Result) 
  
     ;Set In/Outbuffers 
     If Result 
      Result=SetupComm_(*RS232\Handle,*RS232\Inbuffersize,*RS232\OutBuffersize) 
     EndIf 
    EndIf 
  Else 
    CloseHandle_(Result) 
  EndIf 
  ProcedureReturn *RS232\Handle 
EndProcedure 

Procedure SR_CloseComPort(*RS232.structComport) 
  If *RS232\Handle 
    CloseHandle_(*RS232\Handle) 
    *RS232\Handle=0 
  EndIf 
EndProcedure 

Procedure SR_WriteComPort(*RS232.structComport,Rawdata.l,RawDataLength.l) 
  If *RS232\Handle=0 
    ProcedureReturn 
  EndIf 
  Written.l 
  Result=WriteFile_(*RS232\Handle,Rawdata,RawDataLength,@Written,0)  ;WriteData now to ComPort 
  FlushFileBuffers_(*RS232\Handle);Release buffer directly 
  ProcedureReturn Written 
EndProcedure 

Procedure SR_ReadComPort(*RS232.structComport) 
  If *RS232\Handle=0 
    ProcedureReturn 
  EndIf 
  Repeat 
    Result=ReadFile_(*RS232\Handle , *RS232\Receivebuffer+Offset, 256, @RetBytes, 0) ;Read content 
    If RetBytes>0 
     Offset=Offset+RetBytes 
    EndIf 
  Until RetBytes=0 Or Offset>#MaxReceiveBuffer 
  *RS232\ReceivebufferLength=Offset 
  ; FlushFileBuffers_(*RS232\Handle);Release buffer directly 
  ProcedureReturn Offset 
EndProcedure 


;- Begin of MainCode 

MyRS232.structComport ;set my own Structure For all the ComPorthandling 
MyRS232\Port=2 
MyRS232\dcb\Baudrate=9600 
MyRS232\dcb\Bytesize=8 
MyRS232\dcb\StopBits=1 ;#ONESTOPBIT 
MyRS232\dcb\Parity=#NOPARITY 

MyRS232\Inbuffersize=256 ;size is enough 
MyRS232\OutBuffersize=256 

MyRS232\ct\ReadIntervalTimeOut =200; in milliseconds '#MAXDWORD 
MyRS232\ct\ReadTotalTimeoutMultiplier = 1 
MyRS232\ct\ReadTotalTimeoutConstant = 1 
MyRS232\ct\WriteTotalTimeoutConstant = 10 
MyRS232\ct\WriteTotalTimeoutMultiplier = 1 
    
MyRS232\Receivebuffer=AllocateMemory(#MaxReceiveBuffer) ;Reserve mem For it 
MyRS232\ReceivebufferLength=0 


;- Open Window 
hwnd=OpenWindow(#Win, 1, 300, 400, 400, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 
If hwnd 
If CreateGadgetList(WindowID(#Win)) 

  ;- CreateGadgets 
  StringGadget(#Gadget_TextSend, 5, 5, 200, 20, "AT") 
  StringGadget(#Gadget_TextReceive, 5, 55, 390, 340, "",#ES_MULTILINE  ) 
  ButtonGadget(#Gadget_ButtonSend,210,5,90,20,"Send") 
  ButtonGadget(#Gadget_ButtonReceive,305,5,90,20,"Receive") 

  ;- Setup Timer 
  Result=SetTimer_(hwnd,1,100,0) ;Setup our timer For receiveing Data every 100 msecs 

  ;- Setup and Open Comport 
  Result=SR_OpenComPort(MyRS232) 
  
  
  ;- Eventloop 
  Repeat 
   EventID.l = WaitWindowEvent() 

   ;- Timer-Routine to read Data from ComPort 
   If EventID =#WM_TIMER 
     If MyRS232\Handle<>0 
       Readed=SR_ReadComPort(MyRS232) 
      If MyRS232\ReceiveBufferlength>0 
        Buffer.s=Buffer.s+PeekS(MyRS232\ReceiveBuffer,MyRS232\ReceiveBufferlength) 
        SetGadgetText(#Gadget_TextReceive,Buffer.s) 
        MyRS232\ReceiveBufferlength=0 
      EndIf 
     EndIf 
   EndIf 

   If EventID =#PB_Event_Gadget 
     GadgetNR = EventGadget() 
      
     ;- Send Data to Comport 
     If GadgetNR =#Gadget_ButtonSend 
      SendText.s=GetGadgetText(#Gadget_TextSend) + Chr(13) ;add a CarriageReturn to send to modem 
      ;Debug SendText 
      Buffer.s="" 
      SetGadgetText(#Gadget_TextReceive,Buffer.s);Reset inbuffer gadget 
      Result=SR_WriteComPort(MyRS232,@SendText.s,Len(SendText.s)); Check Modem 
      Debug "Characters sended:"+Str(Result) 
     EndIf 

     ;- Read Data from Comport 
     If GadgetNR=#Gadget_ButtonReceive 
      Readed=SR_ReadComPort(MyRS232) ; Read Incoming 
      If Readed 
       Debug "Characters readed="+Str(Readed) 
       Buffer.s=Buffer.s+PeekS(MyRS232\ReceiveBuffer,MyRS232\ReceiveBufferlength) 
       SetGadgetText(#Gadget_TextReceive,Buffer.s) 
       MyRS232\ReceiveBufferlength=0 ;Shorten buffer now 
      EndIf 
     EndIf 
   EndIf 
    
  Until EventID = #PB_Event_CloseWindow 
EndIf 
EndIf 
SR_CloseComPort(MyRS232) ;Comport Close 
End  

;- Error-handler 
Errorhandling: 
MessageRequester("Error","in line "+Str(GetErrorLineNR() ),0) 
End
gruß zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten