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

Thema: Variablenübergabe zwischen RS232 und Atmega32

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Ja vielen Herzlichen Dank für diese tollen Informationen

    Es läuft!

    Hier mal nen Beispiel falls jemand das gleiche Prob hat.

    C Code:
    PHP-Code:
    int index=0;
        
    char ch[19];
    uart_getc();
            if ( 
    UART_NO_DATA )
            {
                
    /* 
                 * no data available from UART 
                 */
            
    }
            else
            {
                
    /*
                 * new data available from UART
                 * check for Frame or Overrun error
                 */
                
    if ( UART_FRAME_ERROR )
                {
                    
    /* Framing Error detected, i.e no stop bit detected */
                    
    uart_puts_P("UART Frame Error: ");
                }
                if ( 
    UART_OVERRUN_ERROR )
                {
                    
    /* 
                     * Overrun, a character already present in the UART UDR register was 
                     * not read by the interrupt handler before the next character arrived,
                     * one or more received characters have been dropped
                     */
                    
    uart_puts_P("UART Overrun Error: ");
                }
                if ( 
    UART_BUFFER_OVERFLOW )
                {
                    
    /* 
                     * We are not reading the receive buffer fast enough,
                     * one or more received character have been dropped 
                     */
                    
    uart_puts_P("Buffer overflow error: ");
                }
                
    /* 
                 * send received character back
                */ 
               
    uart_putc( (unsigned char));
               
               if((
    unsigned char)c!=13)
               {
                    
    ch[index]=c;
                    
    index++;   
               }            
                else
                {
                    
    ch[index]=0;
                    
    index 0;
                    if (
    strcmp (ch,"TEMP1")==0)
                    {
                        
    // Temperatur soll angefragt werden
                        
    uart_puts("Temperatur1=..........\n");
                    }
                    if (
    strcmp (ch,"TEMP2")==0)
                    {
                        
    // Temperatur soll angefragt werden
                        
    uart_puts("Temperatur2=..........\n");
                    }
                    if (
    strcmp (ch,"PH")==0)
                    {
                        
    // Temperatur soll angefragt werden
                        
    uart_puts("PH=..........\n");
                    }
                    if (
    strcmp (ch,"HUMIDITY")==0)
                    {
                        
    // Temperatur soll angefragt werden
                        
    uart_puts("Humidityr=..........\n");
                    }
                    
    ch[0]=0;
                    
                    
                    
                } 
    Geändert von Natureengeneer (27.09.2012 um 19:40 Uhr)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    19.06.2004
    Alter
    50
    Beiträge
    66
    Das ist ja großartig.

    Ich möchte Dich noch auf ein paar Dinge hinweisen, wenn Du Wert auf ein stimmiges Programm legst (zumal Du Deinen Code auch anderen hier zur Verfügung stellst):

    a) Im Falle eines Fehlers, beispielsweise UART_BUFFER_OVERFLOW, UART_OVERRUN_ERROR, UART_FRAME_ERROR wird dessen Wert (inkl. den UART_BUFFER... Bits) nochmals an den PC gesendet (Stichwort "Echo").
    b) dein Prozessor ist unnötig belastet: er vergleicht die bisher empfangene Zeichenkette jedesmal wenn ein einzelnes Zeichen empfangen wurde. D.h. er wird einen Befehl zwei mal ausführen auch wenn Du kein ENTER gedrückt hast (aber nur wenn die Zeichenlänge identisch ist mit dem zuvor abgesetzten Befehl ist, bsp. TEMP1 und TEMP2. Mach Dir bitte die Mühe, und überprüfe den empfangenen String erst dann wenn tatsächlich ENTER empfangen wurde (zumal Du Deinen Code hier als Beispiel veröffentlicht hast)

    Ich mag an dieser Stelle etwas pingelig klingen, aber glaub mir, viele unvorhergesehene Verhaltensweisen eines Roboters oder einer Steuerung haben mit unsachgemäßer Programmierung zu tun. Nicht um sonst gibt es den "Programmierer" als Beruf mit entsprechender Ausbildung.

    Für ein solch' kleines Projekt ist es ggf. noch verschmerzbar, aber spätestens wenn es um das automatische Füttern Deiner Fische geht (wenn Du beispielsweise 3 Wochen in Urlaub bist), wäre es mehr als tragisch wenn deine Fische verhungern oder verkocht sind, weil die Heizung zu hoch heizt.

    Die Erfahrung zeigt: was schief gehen kann, passiert auch. Es ist nur eine Frage der Wahrscheinlichkeit wann ein Bug im Programmcode zum tragen kommt.

    Falls Du mir nicht glaubst, versuche folgendes:

    a) sende an dein Board "TEMP1" und drücke ENTER
    b) sende den Buchstaben "T" an Dein Board und es wird mit "Temperatur1=.......\n" antworten, noch bevor Du ENTER gedrückt hast

    Sei so gut und mache Deine "if (strcmp" Anweisungen bitte in die Klammer von "if ((unsigned char)c==13)" hinein.

    Wenn Du noch Fragen zum Code hast, poste einfach. Ich schau mir den gerne nochmal an.
    Geändert von Chris266 (27.09.2012 um 18:00 Uhr)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.06.2004
    Alter
    50
    Beiträge
    66
    Möglicherweise habe ich etwas übersehen (wer schaut mal drüber?), aber so gefällt es besser:
    Code:
    int index=0;
    char ch[19];
    
    while (1)
    {
      c = uart_getc();
      if ( c & UART_NO_DATA )
      {
        /* 
         * no data available from UART 
         */
      }
      else
      {
        /*
         * new data available from UART
         * check for Frame or Overrun error
         */
        if ( c & UART_FRAME_ERROR )
        {
          /* Framing Error detected, i.e no stop bit detected */
          uart_puts_P("UART Frame Error: ");
          ch[0]=0;
          index=0;
        }
        else
        if ( c & UART_OVERRUN_ERROR )
        {
          /* 
           * Overrun, a character already present in the UART UDR register was 
           * not read by the interrupt handler before the next character arrived,
           * one or more received characters have been dropped
           */
          uart_puts_P("UART Overrun Error: ");
          ch[0]=0;
          index=0;
        }
        else
        if ( c & UART_BUFFER_OVERFLOW )
        {
          /* 
           * We are not reading the receive buffer fast enough,
           * one or more received character have been dropped 
           */
          uart_puts_P("Buffer overflow error: ");
          ch[0]=0;
          index=0;
        }
        else
        {
          /* 
           * send received character back
           */ 
          uart_putc( (unsigned char)c );
               
          if((unsigned char)c!=13)
          {
            ch[index]=c;
            index++;   
          }            
          else
          {
            ch[index]=0;
            index = 0;
            if (strcmp (ch,"TEMP1")==0)
            {
              // Temperatur soll angefragt werden
              uart_puts("Temperatur1=..........\n");
            }
            else
            if (strcmp (ch,"TEMP2")==0)
            {
              // Temperatur soll angefragt werden
              uart_puts("Temperatur2=..........\n");
            }
            else
            if (strcmp (ch,"PH")==0)
            {
              // Temperatur soll angefragt werden
              uart_puts("PH=..........\n");
            }
            else
            if (strcmp (ch,"HUMIDITY")==0)
            {
              // Temperatur soll angefragt werden
              uart_puts("Humidityr=..........\n");
            }    
            ch[0]=0;
          }             
        }
      } 
    }
    PS: es fehlt immernoch die Abfrage, ob die Anzahl der Empfangenen Zeichen länger als 18 sind. Das 19. ist das "0" Byte.
    Geändert von Chris266 (27.09.2012 um 18:18 Uhr)

  4. #4

    Lächeln

    Danke Danke habe den Fehler Korrigiert. Habs auch oben abgeändert. Die Abfrage ob der String länger ist bau ich dann später noch ein.

    In VB2010 habe ich das Senden eines Befehls so angestellt:

    Verbindungsbutton RS232:
    PHP-Code:
    Private Sub Button2_Click(sender As System.ObjectAs System.EventArgsHandles Button2.Click
            
    Try
                
    SerialPort1.PortName TextBox12.Text
                SerialPort1
    .BaudRate TextBox13.Text
                SerialPort1
    .DataBits 8
                SerialPort1
    .StopBits IO.Ports.StopBits.One
                SerialPort1
    .Parity IO.Ports.Parity.None
                SerialPort1
    .Handshake IO.Ports.Handshake.None
                SerialPort1
    .Open()
                
    Button2.Enabled False
                Button1
    .Enabled True
                Button3
    .Enabled True
                Button4
    .Enabled True
                Button5
    .Enabled True
                Button6
    .Enabled True
                Button7
    .Enabled True
                ProgressBar1
    .Value 100
                MsgBox
    ("Connected")
            Catch 
    ex As Exception
                ProgressBar1
    .Value 0
                MsgBox
    ("Connection Error 001")
            
    End Try
        
    End Sub 

    SendeButton:
    PHP-Code:
    Private Sub Button7_Click(sender As System.ObjectAs System.EventArgsHandles Button7.Click
            Dim buffer
    (200) As Byte
            Dim offset 
    As Integer
            Dim count 
    As Integer
            Dim returnValue 
    As Integer
            offset 
    0
            count 
    17
            SerialPort1
    .Write(vbCr)
            
    SerialPort1.Write("TEMP1")
            
    SerialPort1.Write(vbCr)
            
    System.Threading.Thread.Sleep(1000)
            
    Dim IncommingData SerialPort1.ReadExisting   
            TextBox15
    .Text IncommingData
     End Sub 
    Geändert von Natureengeneer (28.09.2012 um 00:41 Uhr)

Ähnliche Themen

  1. Atmega32 zwischen GPS-Modul und PC über RS232 . Brauche Hilfe :)
    Von da_miez3 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 14.04.2012, 17:33
  2. UART zwischen Atmega32 und ATmega8
    Von Lunarman im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 07.06.2007, 16:22
  3. Kommunikation zwischen C++ und ATMega32 (realisieren??)
    Von strunz im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 16
    Letzter Beitrag: 21.04.2006, 05:37
  4. Übertragung von Daten zwischen Atmega32 und Atmega128
    Von OBI im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 11.12.2004, 12:41
  5. Variablenübergabe in Funktion
    Von wolf4124 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 19.08.2004, 18:25

Stichworte

Berechtigungen

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

Labornetzteil AliExpress