Benötige Einstiegshilfe.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

jo für den com port zugriff verwende ich die MVCOM userlib,
und die ReadComBuffer parameter hab ich gleich im letzten code eingefügt ;)
PureBasic 4.40 (Windows - x86)
Frischling
Beiträge: 5
Registriert: 03.01.2007 19:58

Beitrag von Frischling »

Danke für die vielen Antworten bin noch bissel beim reinfitzen.
Leider ist wo der Timer in der Demo nicht verfügbar so dass, das 2. Programm bei mir nicht geht :(
werd mich mal am Wochenende noch bissel selbst am Programm versuchen.
wenn es klemmt meld ich mich noch mal

ansonsten - schönes Wochende und Danke noch mal
Frischling
Beiträge: 5
Registriert: 03.01.2007 19:58

Beitrag von Frischling »

Code: Alles auswählen

    EnableDebugger
;EnableExplicit
Define.w Temp,y, Tempalt ,  Xalt, X

Enumeration ; Gadgets
  #cmdStart       
  #cmdPause
  #cmdReset
  #cmdDrucken
  #cmdSpeichern
  #cmdBeenden
  #datDatum
  #imgGadget
EndEnumeration

Procedure RahmenZeichnen()
  Define x, y, Count
  StartDrawing(WindowOutput(0)) ;Startet das Rahmenzeichnen
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))
  ; links
  Line(58,  70,  0, 451)
  Line(59,  70,  0, 451)
  x = 16
  For y = 483 To 93 Step -30
    Count + 5
    DrawText(x, y, RSet(Str(Count), 2, " ") + "°C")
  Next
  x = 53
  For y = 505 To 85 Step -15
    Line(x, y, 5, 0)
    Line(x, y+1, 5, 0)
  Next
  ; unten
  Line(59, 520, 601, 0)
  Line(59, 521, 601, 0)
  y = 533
  Count = 0
  For x = 100 To 600 Step 50
    Count + 5
    DrawText(x, y, Str(Count))
  Next
  y = 522
  For x = 83 To 658 Step 25
    Line(x, y, 0, 8)
    Line(x+1, y, 0, 8)
  Next
  
  
  
  DrawText(300, 560, "Zeit in Minuten")
  StopDrawing()
EndProcedure

Global ThreadStop, HCom

Procedure ReadComBuffer(timeout)
 Protected NbDataToRead, Empfang$, Timer
 Repeat
 If ElapsedMilliseconds() > Timer
 Timer = ElapsedMilliseconds() + timeout
 If HCom
 NbDataToRead = ComInputBufferCount(HCom)
 If NbDataToRead
 Empfang$ = Space(NbDataToRead)
 If ComRead(HCom, @Empfang$, NbDataToRead)
 Debug Empfang$
 EndIf
 EndIf
 Else
 Debug "Thread Error: HCom=0"
 ThreadStop = 1
 EndIf
 Else
 Delay(10)
 EndIf
 Until ThreadStop
EndProcedure 



If OpenWindow(0, 0, 0, 700, 600, "Templogger  v0.0001...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(#cmdStart,  50, 20, 60, 30, "Start")
    ;ButtonGadget(#cmdPause, 120, 20, 60, 30, "Pause")
    ;ButtonGadget(#cmdReset, 190, 20, 60, 30, "Reset")
    ;ButtonGadget(#cmdDrucken, 260, 20, 60, 30, "Drucken")
    ;ButtonGadget(#cmdSpeichern, 330, 20, 60, 30, "Speichern")
    ButtonGadget(#cmdBeenden, 400, 20, 60, 30, "Beenden")
    DateGadget(#datDatum, 500, 25, 180, 25, "Datum: %mm/%dd/%yyyy Zeit: %hh:%ii")
    ImageGadget(#imgGadget,  60, 70, 0, 0, 0)
  Else
    Debug "CreateGadgetList() Error"
    End
    EndIf   
EndIf
Repeat

If CreateImage(0, 600, 450)
  StartDrawing(ImageOutput(0))
  FillArea(0, 0, -1, $FFFFFF)

 
       
Y = 500 - ((Empfang -5)*6)  
LineXY(Xalt, Tempalt, X, Y , 145)

x=x+1
If X = 598
x = 597
EndIf
xalt = x
Tempalt=Y
  
  
  
  StopDrawing()
  SetGadgetState(#imgGadget, ImageID(0))

Else
  Debug "CreateImage() Error"
EndIf
LoadFont(0, "Fixedsys", 8)

Define Thread, Quit, MyCom$ = "Com2: baud=9600 parity=N data=8 stop=1"

;Repeat
 RahmenZeichnen()
   Select WaitWindowEvent()
   Case #PB_Event_Gadget
   Select EventGadget()
   Case #cmdStart
   Debug GetGadgetText(#cmdStart)
   If GetGadgetText(#cmdStart) = "Start"
   HCom = ComOpen(MyCom$,0,256,0)
   If HCom
   SetGadgetText(#cmdStart, "Stop")
   ThreadStop = 0
   Thread = CreateThread(@ReadComBuffer(), 100)
   Else
   Debug "ComOpen() Error"
   EndIf
   Else ; stop
   If Thread
   ThreadStop = 1
   WaitThread(Thread)
   EndIf
          
   If HCom
   If ComClose(HCom)
   HCom = 0
   SetGadgetText(#cmdStart, "Start")
   Else
   Debug "ComClose() Error"
   EndIf
   EndIf
   EndIf
   Case #cmdBeenden
   Quit = #True
   EndSelect
   Case #PB_Event_CloseWindow
   Quit = #True
  EndSelect
Until Quit
If Thread
  ThreadStop = 1
  WaitThread(Thread)
EndIf
If HCom
  ComClose(HCom)

EndIf


End              
[/code]

Bin noch nicht viel weiter gekommen aber hab schon wieder was wo es leicht hängt.

wollte zu Testzwecken es soch machen das ich eine Variable X hochzähle und mir meine Com Daten als Y dazu nehme wenn ich am ende des bildes bin sorgt
If X = 598
x = 597

dafür das es nicht ewig weiter geht.
Beim Y muss ich aber die Werte erst an das Fenster anpassen und zwar mit Y = 500 - ((Empfang -5)*6) empfang beinhaltet die Werte der Com Schnittstelle
Aber dieses geht nicht weil Empfang ein String ist.
Wie bekomm ich Empfang in Byte Form ?
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

wie sieht eigentlich der output von dem Teil aus,
und wie oft sendet das ding ?
weil jetzt kann es ja auch passieren das nur die halbe anzeige im empfang$ steht, oder das 2 werte vorkommen.
Wie bekomm ich Empfang in Byte Form ?

Code: Alles auswählen

Ergebnis.l = Val(Empfang$)
PureBasic 4.40 (Windows - x86)
Frischling
Beiträge: 5
Registriert: 03.01.2007 19:58

Beitrag von Frischling »

Senden tut es ca. jede Sekunde. Das Programm ist in Bascom geschrieben und ich Sende nur eine Zahl. Er Empfängt auch die Werte korrekt. (siehe Bild)

Das Problem ist das die Empfang$ und Ergebnis Variablen nix beinhalten.

Warum sind es 2 Fenster beim Variablenbeobachter was ist das ober und was ist das untere ? Im unteren sind nämlich meine Werte die ich brauch.

Die Dreiecke was man im Programm sieht, hab ich nur zum Testen gemacht damit ich seh ob es auch so hinhaut was ich hier rein tipp :D

http://1mb.hp-vorlagen.eu/uploads/07.01 ... 7:15_a.bmp

http://1mb.hp-vorlagen.eu/uploads/07.01 ... 9:28_b.bmp

Irgendwie muss es mir gelingen an die Werte zu gelangen, die ich im Debugger Fenster sehe, damit ich meine Temp ins Diagramm bekomm.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

das mit den 2 Fenstern liegt warscheinlich an dem thread,
wie ts-soft schon erwähnte, threads + debugger = nix gut.
aber alles kein problem, muss der thread halt weg :)
deshalb hab ich den code nochmal etwas umgebaut:

Code: Alles auswählen

EnableExplicit

Enumeration ; Fenster
  #Fenster 
EndEnumeration

Enumeration ; Gadgets
  #cmdStart
  #cmdPause
  #cmdReset
  #cmdDrucken
  #cmdSpeichern
  #cmdBeenden
  #datDatum
  #imgGadget
EndEnumeration

Enumeration ; Bilder
  #Bild 
EndEnumeration

Enumeration ; Fonts
  #Font
EndEnumeration

Procedure CheckBuffer(Buffer$)
  ProcedureReturn Val(Buffer$)
EndProcedure

Procedure ReadComBuffer(HCom)
  Protected NbDataToRead, Buffer$
  If HCom
    NbDataToRead = ComInputBufferCount(HCom)
    If NbDataToRead
      Buffer$ = Space(NbDataToRead)
      If ComRead(HCom, @Buffer$, NbDataToRead)
        ProcedureReturn CheckBuffer(Buffer$)
      EndIf
    EndIf
  Else
    Debug "Error: HCom=0"
  EndIf
EndProcedure

Procedure ResetImage()
  StartDrawing(ImageOutput(#Bild))
  Box(0, 0, 640, 450, $FFFFFF)
  StopDrawing()
  SetGadgetState(#imgGadget, ImageID(#Bild))
EndProcedure

Procedure DrawCoordinates()
  Protected x, y, z
  StartDrawing(WindowOutput(#Fenster))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(#Font))
  ; links
  Line(58,  70,  0, 451) : Line(59,  70,  0, 451)
  x = 16
  For y = 483 To 93 Step -30 :  z + 5 : DrawText(x, y, RSet(Str(z), 2, " ") + "°C") : Next
  x = 53
  For y = 505 To 85 Step -15 : Line(x, y, 5, 0) : Line(x, y+1, 5, 0) : Next
  ; unten
  Line(59, 520, 601, 0) :  Line(59, 521, 601, 0)
  y = 533 :  z = 0
  For x = 100 To 600 Step 50 : z + 5 : DrawText(x, y, Str(z)) :  Next
  y = 522
  For x = 83 To 658 Step 25 : Line(x, y, 0, 8) : Line(x+1, y, 0, 8) : Next
  DrawText(300, 560, "Zeit in Minuten")
  StopDrawing()
EndProcedure

Global FullTime.f

Structure TEMPDATA
  temp.l
  time.l
EndStructure

Procedure DrawTemp(TempData.TEMPDATA())
  Protected time.f, temp.f
  Static OldTemp
  ForEach TempData()
    temp + TempData()\temp
    time + TempData()\time
  Next  
  time / 6000
  temp / CountList(TempData())
  ClearList(TempData())
  If FullTime + time > 640
    ResetImage()
    FullTime - 640
  EndIf
  StartDrawing(ImageOutput(#Bild))
  Line(FullTime, 450 - OldTemp * 6, time, (OldTemp - temp) * 6)
  StopDrawing()
  OldTemp = temp
  FullTime + time
  SetGadgetState(#imgGadget, ImageID(#Bild))
EndProcedure

Define Title$ = "Templogger v0.0002"
If OpenWindow(#Fenster, 0, 0, 700, 600, Title$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Fenster))
    ButtonGadget(#cmdStart,  50, 20, 60, 30, "Start")
    ButtonGadget(#cmdPause, 120, 20, 60, 30, "Pause")
    DisableGadget(#cmdPause, 1)
    ButtonGadget(#cmdReset, 190, 20, 60, 30, "Reset")
    ButtonGadget(#cmdDrucken, 260, 20, 60, 30, "Drucken")
    ButtonGadget(#cmdSpeichern, 330, 20, 60, 30, "Speichern")
    ButtonGadget(#cmdBeenden, 400, 20, 60, 30, "Beenden")
    DateGadget(#datDatum, 500, 25, 180, 25, "Datum: %mm/%dd/%yyyy Zeit: %hh:%ii")
    ImageGadget(#imgGadget,  60, 70, 0, 0, 0)
  Else
    Debug "CreateGadgetList() Error"
    End
  EndIf   
EndIf
If CreateImage(0, 600, 450)
  ResetImage()
Else
  Debug "CreateImage() Error"
EndIf
LoadFont(0, "Fixedsys", 8)

Define Quit, HCom, MyCom$, ComTimer, DrawTimer, temp, time, StartTime
NewList TempData.TEMPDATA()

#ComTimeOut = 300
#DrawTimeOut = 30000
MyCom$ = "Com2: baud=9600 parity=N data=8 stop=1"

Repeat
  If HCom
    time = ElapsedMilliseconds()
    If time > ComTimer
      ComTimer = time + #ComTimeOut
      AddElement(TempData())
      TempData()\temp = ReadComBuffer(HCom)
      TempData()\time = time - StartTime
      StartTime = time
    EndIf
    If time > DrawTimer
      DrawTimer = time + #DrawTimeOut
      DrawTemp(TempData())
    EndIf
  EndIf
  Select WaitWindowEvent(50)
    Case #PB_Event_Repaint
      DrawCoordinates()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #cmdStart
          HCom = ComOpen(MyCom$,0,255,0)
          If HCom
            DisableGadget(#cmdStart, 1)
            DisableGadget(#cmdPause, 0)
            StartTime = ElapsedMilliseconds()
          Else
            Debug "ComOpen() Error"
          EndIf
          SetGadgetState(#datDatum, Date())
        Case #cmdPause
          If HCom
            If ComClose(HCom)
              DisableGadget(#cmdPause, 1)
              DisableGadget(#cmdStart, 0)
              HCom = 0
            Else
              Debug "ComClose() Error"
            EndIf
          EndIf
        Case #cmdReset
          ResetImage()
          FullTime = 0
          StartTime = ElapsedMilliseconds()
        Case #cmdDrucken
          ; Drucken
        Case #cmdSpeichern
          ; Speichern
        Case #cmdBeenden
          Quit = #TRUE
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = #TRUE
    Case 0
      Delay(1)
  EndSelect
Until Quit
If HCom
  ComClose(HCom)
EndIf
End
jetzt wird ca alle 300ms der com port abgefragt,
die werte und die zeit werden in einer liste gespeichert.
dann wird alle 30sek die liste abgearbeitet und der mittelwert auf das image gezeichnet.

ich glaub es wär praktischer wenn du bei den werten noch ein zeichen (zb G) als trenner anhängst, weil wenn wirklich mal 2 werte im buffer stehen hast du plötzlich 2525 grad ;)
vielleicht sogar auch noch ein startzeichen zb so ":25G", dann kann man sich 100%ig sicher sein das man einen sauberen wert im buffer hat.
PureBasic 4.40 (Windows - x86)
Antworten