- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: RS232 mit Codevision Puffern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.04.2004
    Beiträge
    18

    RS232 mit Codevision Puffern

    Anzeige

    Praxistest und DIY Projekte
    Hay @all


    Ich habe mal eine ganz Blöde frage. Ich bekomme von einen Controller ein Signal und möchte diese Puffern.
    Codevision hat zwar so etwas in der Art Dabei aber ich weiss nicht wie ich dies Anwenden muss.



    Code:
    
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
       {
       rx_buffer[rx_wr_index]=data;
       if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
       if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          };
       };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif
    
    // Standard Input/Output functions
    #include <stdio.h>
    kann mir jemand sagen wie ich diese Funktion nun nutzen kann bis jetzt werte ich alles durch getchar(); aus.


    MFG: Fichte

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    23.04.2005
    Beiträge
    36
    Hi
    Das puffern geht indem du die TX / RX buffer einstellst und danach mit einer abfrage von rx_counter nachschaust wieviel schon drin ist.
    Kann sein das ich die Frage grad falsch verstanden habe.
    Was genau willst Du puffern? Die Zeichen? Die werden eh in den internen Puffer geschrieben. Schau mal ins Hilfefile das steht alles weitere.
    Grüsse
    Tobi

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.04.2004
    Beiträge
    18
    Hay Tobiaur

    Ich Habe von einem Steuergerät Daten die ich mit dem Atmel Verwerten möchte nun kommen die Werte bei mir in den Atmel so rein.

    Es sind immer 3 Werte im Hex Format. Das Steuergerät Fängt an mir den Hex Wert 0xFF zusenden danach kommt eine Hex Zahl wieviel Daten kommen zbs. 3 also Senden es mir den Hex Wert 0x03 und dann 3 Hex werte.

    Das sieht dann im Normalfall so aus.

    0xFF // Fange an zusenden
    0x03 // Sende 3 Daten Bytes
    0x44 // 1 Datenbyte
    0x22 // 2 Datenbyte
    0x19 // 3 Datenbyte

    Nun möchte ich aber diese eingehnten Daten Auswerten aber er Verwirft sie immer wieder und ich kann sie nicht auswerten.


    MFG: Fichte

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    23.04.2005
    Beiträge
    36
    Hmm
    Idee.
    Du fragst so lange ankommende zeichen ab bis 0xFF da ist.
    Dann ein weiteres um rauszubekommen wieviele Zeichen kommen (sagen wir es wären a Zeichen).
    Dananch wartest Du bis in rx_counter a drinsteht und ziehst die danach rein.
    Ich glaube ich versteh das Problem immer noch net so ganz..
    Warum verwirft der Atmel die? Lies sie mit getchar in ne variable (oder ein Array) und dann sollte das doch klappen, oder?

    Tobi

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    13.04.2004
    Beiträge
    18
    Dachte ich auch ich kann dfie mal meine Funktion Zeigen


    Code:
    if(getchar()==0xff){
          if(getchar()==0x03){
          Ergebnis=(int)getchar()*2.1;
          sprintf(text,"%03u",Ergebnis);
          lcd_gotoxy(0,0);
          lcd_puts(text);
         
          Ergebnis=(int)getchar()*125;
          Ergebnis=(Ergebnis/10);
          sprintf(text,"%04u",Ergebnis);
          lcd_gotoxy(0,1);
          lcd_puts(text);
    
          Ergebnis=(int)getchar()-50;
          sprintf(text,"%02u",Ergebnis);
          lcd_gotoxy(7,1);
          lcd_puts(text);
    So habe ich es Versucht aber er bringt mir keine Anzeige Aufs LCD.!


    MFG: Fichte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress