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(Atmega2560) die Ausgangsspannung
einzustellen.
Der Test der Schnittstellen RS 232 hat wunderbar funktionniert: ich
konnte Daten vom PC nach uC senden.
Meine sorge ist aber folgendes: Ich werde später nicht nur Zahlen zur uC
senden bzw. empfangen sondern Befehle wie ZB: volt 700
Ich habe mir dafür ein Protokol ausgedacht und das code ist unten zu
finden.Ich lese zu erst das ganze Befehl als ein String und mache eine
Auswertung mit strcmp damit habe ich volt, ich werde später Daten
Auswertung mit atoi machen.
Fragen:
1- Ist mein code soweit sinnvoll ?
2- Gibt es bessere alternative ?
3- Warum erkennt AVR der Typ boolean nicht?
Kann jemand mir bitte dabei weiterhelfen ??
vielen Danke
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");
|