SerialPort Monitor

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

SerialPort Monitor

Beitrag von The_Dark_Zim-.- »

Hey ho,

Habe mir ein Überwachungsprogramm für die Serielle Schnittstelle gemacht. Wollte mal eure Meinung zum Quellcode hören, also ob das so in Ordnung ist oder ob ich hier und da anders Programmieren sollte. Mal abgesehen von der fehlenden Kommentierung :P

Hier der Code:

Code: Alles auswählen

Enumeration
  
  #Window_0
  
  #Button_0
  #Button_1
  
  #SerialPort
  
  #Editor_0
  
  #Combo_0
  #Combo_1
  #Combo_2
  #Combo_3
  #Combo_4
  #Combo_5
  
  #Text_0
  #Text_1
  #Text_2
  #Text_3
  #Text_4
  #Text_5
  
EndEnumeration

Global SerialPort$

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 517, 217, 800, 300, "Serial Monitor",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)
    
    ButtonGadget(#Button_0, 655, 30, 80, 30, "Connect")
    ButtonGadget(#Button_1, 745, 30, 30, 30, "C")
    
    EditorGadget(#Editor_0, 25, 70, 730, 200)
    
    ComboBoxGadget(#Combo_0, 25, 40, 75, 20)
    ComboBoxGadget(#Combo_1, 105, 40, 75, 20)
    ComboBoxGadget(#Combo_2, 185, 40, 110, 20)
    ComboBoxGadget(#Combo_3, 300, 40, 40, 20)
    ComboBoxGadget(#Combo_4, 345, 40, 50, 20)
    ComboBoxGadget(#Combo_5, 400, 40, 250, 20)
    
    TextGadget(#Text_0, 25, 20, 75, 20, "Port")
    TextGadget(#Text_1, 105, 20, 75, 20, "Baud")
    TextGadget(#Text_2, 185, 20, 110, 20, "Parity")
    TextGadget(#Text_3, 300, 20, 40, 20, "Data")
    TextGadget(#Text_4, 345, 20, 50, 20, "Stop")
    TextGadget(#Text_5, 400, 20, 250, 20, "Handshake")
    
  EndIf
EndProcedure

Procedure GetAvaileblePorts()
  
  Found$ = "False"
  
  For I = 0 To 20
    
    If OpenSerialPort(#SerialPort, "COM" + Str(i), 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 2048, 2048)
      AddGadgetItem(#Combo_0, -1, "COM" + Str(i))
      CloseSerialPort(#SerialPort)
      Found$ = "True"
    EndIf
    
  Next  
  
  If Found$ = "False"
    MessageRequester("Serielle Schnittstelle","Konnte keine Serielle Schnittstelle verbinden")
  Else
    SetGadgetState(#Combo_0, 0)
    SerialPort$ = GetGadgetText(#Combo_0)
  EndIf
  
EndProcedure

Procedure SerialPortSettings()
  
  AddGadgetItem(#Combo_1,-1,"50")
  AddGadgetItem(#Combo_1,-1,"75")
  AddGadgetItem(#Combo_1,-1,"110")
  AddGadgetItem(#Combo_1,-1,"150")
  AddGadgetItem(#Combo_1,-1,"300")
  AddGadgetItem(#Combo_1,-1,"600")
  AddGadgetItem(#Combo_1,-1,"1200")
  AddGadgetItem(#Combo_1,-1,"1800")
  AddGadgetItem(#Combo_1,-1,"2400")
  AddGadgetItem(#Combo_1,-1,"4800")
  AddGadgetItem(#Combo_1,-1,"9600")
  AddGadgetItem(#Combo_1,-1,"19200")
  AddGadgetItem(#Combo_1,-1,"38400")
  AddGadgetItem(#Combo_1,-1,"57600")
  AddGadgetItem(#Combo_1,-1,"115200")
  
  AddGadgetItem(#Combo_2,-1,"Keine")
  AddGadgetItem(#Combo_2,-1,"Gerade (Even)")
  AddGadgetItem(#Combo_2,-1,"Mark")
  AddGadgetItem(#Combo_2,-1,"Odd")
  AddGadgetItem(#Combo_2,-1,"Space")
  
  AddGadgetItem(#Combo_3,-1,"7")
  AddGadgetItem(#Combo_3,-1,"8")
  
  AddGadgetItem(#Combo_4,-1,"1")
  AddGadgetItem(#Combo_4,-1,"1,5")
  AddGadgetItem(#Combo_4,-1,"2")
  
  AddGadgetItem(#Combo_5,-1,"Kein handshaking")
  AddGadgetItem(#Combo_5,-1,"Kein handshaking, aber RTS wird auf 1 gesetzt")
  AddGadgetItem(#Combo_5,-1,"RTS/CTS")
  AddGadgetItem(#Combo_5,-1,"Xon/Xoff")
  
  SetGadgetState(#Combo_1, 10)
  SetGadgetState(#Combo_2, 0)
  SetGadgetState(#Combo_3, 1)
  SetGadgetState(#Combo_4, 0)
  SetGadgetState(#Combo_5, 0)
  
EndProcedure

Baud = 9600
Parity = #PB_SerialPort_NoParity
DataBits = 8
StopBits.d = 1
Handshake = #PB_SerialPort_NoHandshake
Connected$ = "False"

Open_Window_0()

GetAvaileblePorts()
SerialPortSettings()

Repeat
  
  Event = WaitWindowEvent(10)
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType() 
  
  Select Event
    Case #PB_Event_Gadget
      
      Select GadgetID
        Case #Button_0
          If GetGadgetText(#Button_0) = "Connect"
            If OpenSerialPort(#SerialPort,SerialPort$,Baud,Parity,DataBits,StopBits.d,Handshake, 2048, 2048)
              SetGadgetText(#Button_0,"Disconnect")
              AddGadgetItem(#Editor_0, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Connected to " + SerialPort$)
              Connected$ = "True"
            EndIf
          Else
            SetGadgetText(#Button_0,"Connect")
            CloseSerialPort(#SerialPort)
            AddGadgetItem(#Editor_0, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Disconnected")
            Connected$ = "False"
          EndIf
        Case #Button_1
          ClearGadgetItems(#Editor_0) 
        Case #Combo_0
          SerialPort$ = GetGadgetText(#Combo_0)
        Case #Combo_1
          Baud = Val(GetGadgetText(#Combo_1))
        Case #Combo_2
          State = GetGadgetState(#Combo_2)
          Select state
            Case 0
              Parity = #PB_SerialPort_NoParity
            Case 1
              Parity = #PB_SerialPort_EvenParity
            Case 2
              Parity = #PB_SerialPort_MarkParity
            Case 3
              Parity = #PB_SerialPort_OddParity
            Case 4
              Parity = #PB_SerialPort_SpaceParity
          EndSelect
        Case #Combo_3
          DataBits = Val(GetGadgetText(#Combo_3))
        Case #Combo_4
          StopBits.d = ValD(GetGadgetText(#Combo_4))
        Case #Combo_5
          State = GetGadgetState(#Combo_5)
          Select State
            Case 0
              Handshake = #PB_SerialPort_NoHandshake
            Case 1
              Handshake = #PB_SerialPort_RtsHandshake
            Case 2
              Handshake = #PB_SerialPort_RtsCtsHandshake
            Case 3
              Handshake = #PB_SerialPort_XonXoffHandshake
          EndSelect
          
      EndSelect
      
    Case #PB_Event_SizeWindow 
      
      If WindowWidth(#Window_0) < 800
        ResizeWindow(#Window_0,WindowX(#Window_0),WindowY(#Window_0),800,WindowHeight(#Window_0))
      EndIf
      
      If WindowHeight(#Window_0) < 300
        ResizeWindow(#Window_0,WindowX(#Window_0),WindowY(#Window_0),WindowWidth(#Window_0),300)
      EndIf
      
      ResizeGadget(#Editor_0, 25, 70, WindowWidth(#Window_0)-50, WindowHeight(#Window_0)-100)
      
    Default
      Delay(1)
  EndSelect
  
  If Connected$ = "True"
    If AvailableSerialPortInput(#SerialPort) > 0
      TempASCII$ = ""
      TempHEX$ = ""
      TempDecimal$ = ""
      
      While AvailableSerialPortInput(#SerialPort) > 0
        
        ReadSerialPortData(#SerialPort,@RD,1)
        
        If RD = 13
          TempASCII$ + " CR "
        ElseIf RD = 10
          TempASCII$ + " LF "
        Else
          TempASCII$ + Chr(RD)
        EndIf
        
        TempHEX$ + " " +RSet(Hex(RD, #PB_Byte),2,"0")
        TempDecimal$ + " " + RSet(Str(RD),3,"0")
        
      Wend
      
      AddGadgetItem(#Editor_0, 0, "")
      AddGadgetItem(#Editor_0, 0, "---------------------------------------------------------------------------------")
      AddGadgetItem(#Editor_0, 0, " ASCII: " + TempASCII$)
      AddGadgetItem(#Editor_0, 0, " HEX: " + TempHEX$)
      AddGadgetItem(#Editor_0, 0, " Decimal: " + TempDecimal$)
      AddGadgetItem(#Editor_0, 0, FormatDate("%hh:%ii:%ss", Date()) + " | ----------------------------------------------------------------")
      
    EndIf
  EndIf  
  
Until Event = #PB_Event_CloseWindow

End
;
Mit freundlichem Gruß
The_Dark_Zim-.-

Edit:
War wohl das falsche Fach ^^ sry
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: SerialPort Monitor

Beitrag von The_Dark_Zim-.- »

Hm so Schlimm?

Code: Alles auswählen

Enumeration
  
  #Window_0
  
  #Button_0
  #Button_1
  
  #SerialPort
  
  #Tabs
  
  #Editor_0
  #Editor_1
  #Editor_2
  
  #Combo_0
  #Combo_1
  #Combo_2
  #Combo_3
  #Combo_4
  #Combo_5
  
  #Text_0
  #Text_1
  #Text_2
  #Text_3
  #Text_4
  #Text_5
  
EndEnumeration

Global SerialPort$

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 517, 217, 1024 , 768, "Serial Monitor",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)
    
    PanelGadget(#Tabs, 10, 70, 700, 688)
    
    AddGadgetItem (#Tabs, -1, "ASCII")
    EditorGadget(#Editor_0, 5, 5, 685, 653)
    
    AddGadgetItem (#Tabs, -1, "Hex")
    EditorGadget(#Editor_1, 5, 5, 685, 653)
    
    AddGadgetItem (#Tabs, -1, "Decimal")
    EditorGadget(#Editor_2, 5, 5, 685, 653)
    
    CloseGadgetList()
    
    ButtonGadget(#Button_0, 655, 30, 80, 30, "Connect")
    ButtonGadget(#Button_1, 745, 30, 30, 30, "C")
    
    ComboBoxGadget(#Combo_0, 25, 40, 75, 20)
    ComboBoxGadget(#Combo_1, 105, 40, 75, 20)
    ComboBoxGadget(#Combo_2, 185, 40, 110, 20)
    ComboBoxGadget(#Combo_3, 300, 40, 40, 20)
    ComboBoxGadget(#Combo_4, 345, 40, 50, 20)
    ComboBoxGadget(#Combo_5, 400, 40, 250, 20)
    
    TextGadget(#Text_0, 25, 20, 75, 20, "Port")
    TextGadget(#Text_1, 105, 20, 75, 20, "Baud")
    TextGadget(#Text_2, 185, 20, 110, 20, "Parity")
    TextGadget(#Text_3, 300, 20, 40, 20, "Data")
    TextGadget(#Text_4, 345, 20, 50, 20, "Stop")
    TextGadget(#Text_5, 400, 20, 250, 20, "Handshake")
    
  EndIf
EndProcedure

Procedure GetAvaileblePorts()
  
  Found$ = "False"
  
  For I = 0 To 20
    
    If OpenSerialPort(#SerialPort, "COM" + Str(i), 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 2048, 2048)
      AddGadgetItem(#Combo_0, -1, "COM" + Str(i))
      CloseSerialPort(#SerialPort)
      Found$ = "True"
    EndIf
    
  Next  
  
  If Found$ = "False"
    MessageRequester("Serielle Schnittstelle","Konnte keine Serielle Schnittstelle verbinden")
  Else
    SetGadgetState(#Combo_0, 0)
    SerialPort$ = GetGadgetText(#Combo_0)
  EndIf
  
EndProcedure

Procedure SerialPortSettings()
  
  AddGadgetItem(#Combo_1,-1,"50")
  AddGadgetItem(#Combo_1,-1,"75")
  AddGadgetItem(#Combo_1,-1,"110")
  AddGadgetItem(#Combo_1,-1,"150")
  AddGadgetItem(#Combo_1,-1,"300")
  AddGadgetItem(#Combo_1,-1,"600")
  AddGadgetItem(#Combo_1,-1,"1200")
  AddGadgetItem(#Combo_1,-1,"1800")
  AddGadgetItem(#Combo_1,-1,"2400")
  AddGadgetItem(#Combo_1,-1,"4800")
  AddGadgetItem(#Combo_1,-1,"9600")
  AddGadgetItem(#Combo_1,-1,"19200")
  AddGadgetItem(#Combo_1,-1,"38400")
  AddGadgetItem(#Combo_1,-1,"57600")
  AddGadgetItem(#Combo_1,-1,"115200")
  
  AddGadgetItem(#Combo_2,-1,"Keine")
  AddGadgetItem(#Combo_2,-1,"Gerade (Even)")
  AddGadgetItem(#Combo_2,-1,"Mark")
  AddGadgetItem(#Combo_2,-1,"Odd")
  AddGadgetItem(#Combo_2,-1,"Space")
  
  AddGadgetItem(#Combo_3,-1,"7")
  AddGadgetItem(#Combo_3,-1,"8")
  
  AddGadgetItem(#Combo_4,-1,"1")
  AddGadgetItem(#Combo_4,-1,"1,5")
  AddGadgetItem(#Combo_4,-1,"2")
  
  AddGadgetItem(#Combo_5,-1,"Kein handshaking")
  AddGadgetItem(#Combo_5,-1,"Kein handshaking, aber RTS wird auf 1 gesetzt")
  AddGadgetItem(#Combo_5,-1,"RTS/CTS")
  AddGadgetItem(#Combo_5,-1,"Xon/Xoff")
  
  SetGadgetState(#Combo_1, 10)
  SetGadgetState(#Combo_2, 0)
  SetGadgetState(#Combo_3, 1)
  SetGadgetState(#Combo_4, 0)
  SetGadgetState(#Combo_5, 0)
  
EndProcedure

Baud = 9600
Parity = #PB_SerialPort_NoParity
DataBits = 8
StopBits.d = 1
Handshake = #PB_SerialPort_NoHandshake
Connected$ = "False"

Open_Window_0()

GetAvaileblePorts()
SerialPortSettings()

Repeat
  
  Event = WaitWindowEvent(10)
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType() 
  
  Select Event
    Case #PB_Event_Gadget
      
      Select GadgetID
        Case #Button_0
          If GetGadgetText(#Button_0) = "Connect"
            If OpenSerialPort(#SerialPort,SerialPort$,Baud,Parity,DataBits,StopBits.d,Handshake, 2048, 2048)
              SetGadgetText(#Button_0,"Disconnect")
              AddGadgetItem(#Editor_0, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Connected to " + SerialPort$)
              AddGadgetItem(#Editor_1, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Connected to " + SerialPort$)
              AddGadgetItem(#Editor_2, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Connected to " + SerialPort$)
              Connected$ = "True"
            EndIf
          Else
            SetGadgetText(#Button_0,"Connect")
            CloseSerialPort(#SerialPort)
            AddGadgetItem(#Editor_0, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Disconnected")
            AddGadgetItem(#Editor_1, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Disconnected")
            AddGadgetItem(#Editor_2, 0, FormatDate("%hh:%ii:%ss", Date()) + " | Disconnected")
            Connected$ = "False"
          EndIf
        Case #Button_1
          ClearGadgetItems(#Editor_0)
          ClearGadgetItems(#Editor_1)
          ClearGadgetItems(#Editor_2)
        Case #Combo_0
          SerialPort$ = GetGadgetText(#Combo_0)
        Case #Combo_1
          Baud = Val(GetGadgetText(#Combo_1))
        Case #Combo_2
          State = GetGadgetState(#Combo_2)
          Select state
            Case 0
              Parity = #PB_SerialPort_NoParity
            Case 1
              Parity = #PB_SerialPort_EvenParity
            Case 2
              Parity = #PB_SerialPort_MarkParity
            Case 3
              Parity = #PB_SerialPort_OddParity
            Case 4
              Parity = #PB_SerialPort_SpaceParity
          EndSelect
        Case #Combo_3
          DataBits = Val(GetGadgetText(#Combo_3))
        Case #Combo_4
          StopBits.d = ValD(GetGadgetText(#Combo_4))
        Case #Combo_5
          State = GetGadgetState(#Combo_5)
          Select State
            Case 0
              Handshake = #PB_SerialPort_NoHandshake
            Case 1
              Handshake = #PB_SerialPort_RtsHandshake
            Case 2
              Handshake = #PB_SerialPort_RtsCtsHandshake
            Case 3
              Handshake = #PB_SerialPort_XonXoffHandshake
          EndSelect
          
      EndSelect
      
    Case #PB_Event_SizeWindow 
      
      If WindowWidth(#Window_0) < 800
        ResizeWindow(#Window_0,WindowX(#Window_0),WindowY(#Window_0),800,WindowHeight(#Window_0))
      EndIf
      
      If WindowHeight(#Window_0) < 300
        ResizeWindow(#Window_0,WindowX(#Window_0),WindowY(#Window_0),WindowWidth(#Window_0),300)
      EndIf
      
      ResizeGadget(#Tabs, 10, 70, WindowWidth(#Window_0)-20, WindowHeight(#Window_0)-80)
      
      ResizeGadget(#Editor_0, 5, 5, WindowWidth(#Window_0)-35, WindowHeight(#Window_0)-115)
      ResizeGadget(#Editor_1, 5, 5, WindowWidth(#Window_0)-35, WindowHeight(#Window_0)-115)
      ResizeGadget(#Editor_2, 5, 5, WindowWidth(#Window_0)-35, WindowHeight(#Window_0)-115)
            
    Default
      Delay(1)
  EndSelect
  
  If Connected$ = "True"
    If AvailableSerialPortInput(#SerialPort) > 0
      TempASCII$ = ""
      TempHEX$ = ""
      TempDecimal$ = ""
      
      While AvailableSerialPortInput(#SerialPort) > 0
        
        ReadSerialPortData(#SerialPort,@RD,1)
        
        If RD = 13
          TempASCII$ + " CR "
        ElseIf RD = 10
          TempASCII$ + " LF "
        Else
          TempASCII$ + Chr(RD)
        EndIf
        
        TempHEX$ + " " +RSet(Hex(RD, #PB_Byte),2,"0")
        TempDecimal$ + " " + RSet(Str(RD),3,"0")
        
      Wend
      
      AddGadgetItem(#Editor_0, 0, "")
      AddGadgetItem(#Editor_0, 0, "---------------------------------------------------------------------------------")
      AddGadgetItem(#Editor_0, 0, " ASCII: " + TempASCII$)
      AddGadgetItem(#Editor_0, 0, FormatDate("%hh:%ii:%ss", Date()) + " | ----------------------------------------------------------------")
      
      AddGadgetItem(#Editor_1, 0, "")
      AddGadgetItem(#Editor_1, 0, "---------------------------------------------------------------------------------")
      AddGadgetItem(#Editor_1, 0, " HEX: " + TempHEX$)
      AddGadgetItem(#Editor_1, 0, FormatDate("%hh:%ii:%ss", Date()) + " | ----------------------------------------------------------------")
      
      AddGadgetItem(#Editor_2, 0, "")
      AddGadgetItem(#Editor_2, 0, "---------------------------------------------------------------------------------")
      AddGadgetItem(#Editor_2, 0, " Decimal: " + TempDecimal$)
      AddGadgetItem(#Editor_2, 0, FormatDate("%hh:%ii:%ss", Date()) + " | ----------------------------------------------------------------")
      
    EndIf
  EndIf  
  
Until Event = #PB_Event_CloseWindow

End
;
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten