Forum: Mikrocontroller und Digitale Elektronik RS_232 Kommunikation


von Claude (Gast)


Lesenswert?

Hallo an Alle,
Ich bin Student (Praktikant) und wir wollen einen Leistungsgenerator:
1KV_Ausgangspannung und dazu ein  Kommunikationsboard aufbauen. Auf dem
Kommunikationsboard sollte 3
Kommunikationsschnittstellen (RS 232, USB und Ethernet) zur Verfügung
gestellt werden. Von diese Schnittstellen(RS 232, USB und Ethernet)
sollte es möglich sein durch uC (Atmega 2560) die Ausgangsspannung 
einzustellen.
Zur testen der  Schnittstellen RS 232 habe ich folgende Funktionnen
getestet und alles hat wunderbar funktionniert: ich konnte Daten vom PC
nach uC  senden.

Meine sorge ist folgendes: Ich werde später nicht nur Zahlen zur uC
senden bzw. empfangen sondern Befehle wie ZB: volt 700
Ich habe mir ein Protokol ausgedacht,ich lese erstmal das ganze Befehl 
als ein String und danach mache ich eine Auswertung von volt mit der 
Funktion strcmp der ZB. 700 werde ich  später mit atoi auswerten.


Fragen:

1- Ist mein code soweit sinnvoll ?
2- Gigt es eine bessere alternative ?
3- Warum erkennt AVR kein boolean ?
1
#include <avr/io.h>
2
#include <interrupt.h>
3
4
5
#define LENG 15;                        // Länge des gesamten  Befehlsvector: read_buff[LENG];
6
7
volatile  char komd_1[] = "volt";      // Befehl_1
8
volatile  char komd_2[] = "curr";      // Befehl_1
9
10
volatile unsigned int i;               // Index von  read_buff[LENG];
11
volatile  boolean read_rcv;            // Zum Kontrolieren ob Data empfangen wurde
12
volatile  char read_buff[LENG];        // Tabelle um das gesamte Befehl einzulesen
13
14
15
SIGNAL(SIG_USART1_RECV)                // Interrupt zum Einlesen der empfangenen Daten ( Befehl) 
16
{  
17
    read_buff[i] = UDR;                // Schreiben eines Bits aus UDR ins read_buff[i]
18
    if(++i>=15)                      // Kontroliert ob man schon am Ende vom read_buff[i]
19
    {
20
    i=0;  
21
    }
22
  read_rcv = True;
23
}
24
25
26
int main(void)
27
{
28
    while(1)
29
   {  
30
    sei()
31
      if (read_rcv == TRUE) 
32
    { 
33
      if (strcmp(komd_1,read_buff[0,3]==0))     // Vergleich vom konstanten Komd_1 mit dem 4 erste Charakters des Befehls: Auswertung
34
        {
35
        // do something
36
        
37
      }  else if (strcmp(komd_2,read_buff[0,3]==0))      // Vergleich vom konstanten Komd_2 (curr) mit dem 4 erste Charakters des Befehls
38
    
39
          {
40
                 // do something
41
           }       
42
    
43
    }  else  
44
         { transmit_Felh ("Fehler");
45
         read_rcv == FALSE;
46
       }         
47
   }
48
}

Kann jemand mir bitte dabei weiterhelfen ??

vielen Danke

: Gesperrt durch User
von xfr (Gast)


Lesenswert?

Claude schrieb:
> if (strcmp(komd_1,read_buff[0,3]==0))

Hast Du das Programm überhaupt schon mal compiliert? Das läuft doch 
bestimmt nicht durch ...

Der Datentyp bool geht mit:
#include <stdboolh.>

von xfr (Gast)


Lesenswert?

Muss natürlich heißen:
#include <stdbool.h>

von Karl H. (kbuchegg)


Lesenswert?

Claude schrieb:

> Kann jemand mir bitte dabei weiterhelfen ??

Wie wärs, wenn du in deinen UNterlagen erst mal das Kapitel über 
C-Strings studierst und ein paar Vorübungen auf dem PC (natürlich mit 
einem C-Compiler, der auf einem PC läuft) machst?

Stringverarbeitung ist für die meisten C-Neulinge der erste wirkliche 
Stolperstein, weil es da ein paar Dinge zu beachten gibt. Dazu ist es 
aber hilfreich, wenn man eben nicht im Nebel stochert, wie in der 
AVR-Programmeirung, sondern sich schnell und einfach ein paar Dinge auf 
der Konsole ausgeben lassen kann. Die 3 Stunden, die du auf dem PC 
investierst, um dir dort das Rüstzeug zur Stingbehandlung in C zu holen, 
werden durch eine schnellere, und was wichtig ist - eine fehlerfreiere, 
Programmentwicklung auf dem AVR dann bei weitem wieder wett gemacht. 
Unter anderem auch deshalb, weil du dir einige zentrale Elemente deines 
AVR Programms auf dem PC vorfertigen kannst (zb die Kommandoauswertung 
oder auch den Aufbau des Strings aus Einzelzeichen), die (weil 
unabhängig von der Hardware) du dann einfach auf den AVR übernehmen 
kannst.


String-Verarbeitung in C


Und wenn ich dein Programmso durchsehe, würden dir ein paar generelle 
Übungen zu Arrays auch nicht schaden)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie oft eigentlich noch?

Beitrag "RS 232 Befehle"

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.