Seite 1 von 1

Problem mit RS232

Verfasst: 24.11.2024 17:24
von Voni
Hallo!

Ich habe folgenden Code (Umsetzung eines C-Codes aus dem I-Net, Tastenabfrage-Code hier aus dem Forum) zum Testen von TM1637 7-Segment-Anzeigen über einen USB-RS232 Konverter, der soweit gut funktioniert. Nach dem Beenden des Programms wird die Com-Schnittstelle auch geschlossen, das kann ich an einer Status-LED meines Interfaces erkennen. Aber bei einem weiteren Start kann die COM-Schnittstelle nicht wieder geöffnet werden. Erst wenn ich den Konverter vom USB-Port abziehe und wieder verbinde, also den Treiber dadurch in Windows entlade, kann die Schnittstelle vom Programm wieder geöffnet werden. Das Problem liegt also wohl am Treiber des Konverters. Habt ihr eine Idee, wie ich das Problem beseitigen kann?

-Ralf

Code: Alles auswählen

Global hellig.b
Global port.b
port = 0

; 
;     Segmentbelegung der Anzeige:
; 
;         a
; 
;        ---
; 
;     f | g | b            Segment |  a  |  b  |  c  |  d  |  e  |  f  |  g  | Doppelpunkt (nur fuer POS1) |
; 
;        ---               ---------------------------------------------------------------------------------
; 
;     e |   | c            Bit-Nr. |  0  |  1  |  2  |  3  |  4  |  5  |  6  |              7              |
; 
;        ---
; 
;         d
; 
;     Bit 7 der 7-Segmentanzeige POS1 ist der Doppelpunkt

; 
; /* ----------------------------------------------------------
; 
;                    TM1637 - Definitionen
; 
;    ---------------------------------------------------------- */
; 


Procedure tm1637_start() 
    
    SetSerialPortStatus(port, #PB_SerialPort_RTS, 1)   ;Clk high
    SetSerialPortStatus(port, #PB_SerialPort_DTR, 1)   ;DIO high
    Delay(1)
    SetSerialPortStatus(port, #PB_SerialPort_DTR, 0)   ;DIO low 

EndProcedure   

Procedure tm1637_stop()  

    SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)   ;Clk low
    Delay(1)
    SetSerialPortStatus(port, #PB_SerialPort_DTR, 0)   ;DIO low  
    Delay(1)
    SetSerialPortStatus(port, #PB_SerialPort_RTS, 1)   ;Clk high
    Delay(1)
    SetSerialPortStatus(port, #PB_SerialPort_DTR, 1)   ;DIO high
    
EndProcedure      

Procedure tm1637_write(value.b) 

    For i = 0 To 7  
      SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)   ;Clk low
      If value & 1 
        SetSerialPortStatus(port, #PB_SerialPort_DTR, 1)   ;DIO high
      Else  
        SetSerialPortStatus(port, #PB_SerialPort_DTR, 0)   ;DIO low  
      EndIf
      Delay(1)
      value >> 1 
      SetSerialPortStatus(port, #PB_SerialPort_RTS, 1)   ;Clk high
      Delay(1)
    Next i  

    SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)   ;Clk low
    Delay(1)
    SetSerialPortStatus(port, #PB_SerialPort_RTS, 1)   ;Clk high
    Delay(1)
    SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)   ;Clk low

EndProcedure       
      
; 
; /*  ----------------------------------------------------------
; 
;                       Benutzerfunktionen
; 
;     ---------------------------------------------------------- */
; 
;  /*  ------------------- SELECTPOS ---------------------------
; 
;         waehlt die zu beschreibende Anzeigeposition aus
; 
;      --------------------------------------------------------- */

Procedure tm1637_selectpos(nr)

    tm1637_start()
    tm1637_write(64)
    tm1637_stop()
    tm1637_start()
    tm1637_write(192+nr)

EndProcedure
  
  
  
; 
; /*  ----------------------- SETBRIGHT ------------------------
; 
;        setzt die Helligkeit der Anzeige
; 
;        erlaubte Werte fuer Value sind 0 .. 15
; 
;     ---------------------------------------------------------- */

Procedure tm1637_setbright(value)

    tm1637_start()
    tm1637_write(128+value)
    tm1637_stop()

EndProcedure    
    
    
; 
; /*  ------------------------- CLEAR -------------------------
; 
;        loescht die Anzeige auf dem Modul
; 
;     --------------------------------------------------------- */

Procedure tm1637_clear() 
  
    tm1637_selectpos(0)  
    For i=0 To 5 
      tm1637_write(0)
    Next i  
    tm1637_stop()  
    tm1637_setbright(hellig)   

EndProcedure   



; /*  ---------------------- SETZIF ---------------------------
; 
;        gibt ein Ziffer an einer Position aus
; 
;     --------------------------------------------------------- */

Procedure tm1637_setzif(pos, zif)
    
    tm1637_selectpos(pos)
    tm1637_write(zif)
    tm1637_stop()

EndProcedure
    

; 
; /*  ----------------------- INIT ----------------------------
; 
;        öffnet den COM-Port
; 
;     ---------------------------------------------------------- */

Procedure tm1637_init()

  cp = OpenSerialPort(port, "COM4", 300, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
  
  If Not cp
    MessageRequester("","Port nicht geöffnet")
    CloseSerialPort(port)
  End
EndIf

EndProcedure    



Macro GetBit(value,bit)
  (value>>bit&1)
EndMacro

Procedure.s gedrueckteTaste()
  
  For X = 0 To 255
   If getbit(GetKeyState_(X),7)     KName$ = Space(255) 
    GetKeyNameText_(MapVirtualKey_(X,0)*$10000,KName$,255) 
    ProcedureReturn KName$
   EndIf   
 Next
      
EndProcedure


hellig= 15;
tm1637_init()
tm1637_clear()

; led7sbmp[0] = 63
; led7sbmp[1] = 6
; led7sbmp[2] = 91
; led7sbmp[3] = 79
; led7sbmp[4] = 102
; led7sbmp[5] = 109
; led7sbmp[6] = 125
; led7sbmp[7] = 7
; led7sbmp[8] = 127
; led7sbmp[9] = 111
; led7sbmp[10] = 119 ;a 
; led7sbmp[11] = 124 ;b 
; led7sbmp[12] = 57  ;c
; led7sbmp[13] = 94  ;d
; led7sbmp[14] = 121 ;E
; led7sbmp[15] = 113 ;F
  
      
      
       
Repeat  
  
Taste.s = gedrueckteTaste()
  
  If Taste="ESC"   ; press Esc to quit
    CloseSerialPort(port)
    End
  ElseIf Taste="1" 
    tm1637_clear()
    tm1637_setzif(2,6) ;1. Stelle
  ElseIf Taste="2"  
    tm1637_clear() 
    tm1637_setzif(1,91) ;2. Stelle
  ElseIf Taste="3"  
    tm1637_clear() 
    tm1637_setzif(0,79) ;3. Stelle
  ElseIf Taste="4"  
    tm1637_clear() 
    tm1637_setzif(5,102) ;4. Stelle
  ElseIf Taste="5"  
    tm1637_clear()  
    tm1637_setzif(4,109) ;5. Stelle
  ElseIf Taste="6"  
    tm1637_clear()  
    tm1637_setzif(3,125)  ;6. Stelle
  EndIf

 Delay(1)

ForEver

Re: Problem mit RS232

Verfasst: 25.11.2024 13:39
von H.Brill
Vielleicht liegt es ja auch an den Signalleitungen (DTR,RTS), die du ja ausgiebig nutzt.
Evtl. bringt es was, wenn du vor dem Schließen des Ports diese Leitungen auf LOW
ziehst. Vielleicht entlädt sich der Treiber dehalb nicht, weil er noch HIGH - geschaltete
Leitungen erkennt.
Ist nur eine Vermutung, bin halt kein Fachmann dafür. Aber manchmal geht Probieren über
Studieren.

Re: Problem mit RS232

Verfasst: 25.11.2024 14:02
von Voni
Danke für den Hinweis, hatte tatsächlich auch schon so einen Gedanken. Ich werde das mal testen und berichten.

Re: Problem mit RS232

Verfasst: 26.11.2024 14:53
von Voni
Hab jetzt einen anderen USB-Seriell-Konverter genommen und das Problem hat sich in Wohlgefallen aufgelöst. Also eindeutig ein Treiberproblem des Konverters.

Re: Problem mit RS232

Verfasst: 26.11.2024 19:36
von H.Brill
Voni hat geschrieben: 26.11.2024 14:53 Hab jetzt einen anderen USB-Seriell-Konverter genommen und das Problem hat sich in Wohlgefallen aufgelöst. Also eindeutig ein Treiberproblem des Konverters.
Ja, am besten sind die mit dem FTDI-Chip. Mit den anderen hatte ich vor Jahren auch immer Probleme gehabt. Seit ich meinen Digitus habe,
funktioniert alles bestens.