mikrocontroller.net

Forum: Compiler & IDEs Anfängerfragen zu C mit AVR Studio 7


Autor: Joern DK7JB .. (moin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mache momentan meine erste Gehversuche mit C und dem Atmel Studio 7 
und hätte hierzu einige Fragen.
Bisher habe ich in den letzten Jahren meine ATMegas unter Assembler, 
Bascom und dann LunaAVR programmiert. Am PC arbeite ich unter Windows 
mit vb.net. Als Buch habe ich "AVR Mikrocontroller Programmierng in C" 
von Heimo Gaichler.

Hier meine Fragen. Um es euch leichter zu machen habe ich sie mit 
Nummern versehen:

(1) Wie hilft man sich, wenn man eigentlich den boolscher Datentyp 
benötigt?
Eine Variable kann den Wert wahr oder falsch einnehmen.

(2) Wie arbeitet man am besten mit float Variablen (single und double)?

(3) Gibt es gute Mathebibliotheken?

(4) Gibt es gute Bibliotheken um von dem einen Datentyp in den anderen 
Datentyp umzuwandeln.

(5) Wie geht ihr mit Strings um, wenn es unter C keinen String-Datentyp 
gibt? Wie löst ihr einfache Stringdarstellung und Stringoperationen (wie 
z. B in Bascom oder LunAVR) mit Umwandlung der anderen Datentypen in 
Strings um umgekehrt

(6) Welche Ausgaberoutinen/Bibliotheken mit Fifo über Uart haben sind 
bewährt? Ganze Zahlen, Dezimalbrüche und Strings oder ein Gemisch von 
ihnen?
Die Bibliothek von Peter Fleury habe ich ausprobiert. Ich habe aber noch 
nicht verstanden, wie man mit ihr Zeichenfolgen ausgeben kann.


Gibt zu den Fragepunkten gute und bewährte Bibliotheken und vielleicht 
auch Beispiele? Wie löst ihr solche Probleme? Bei mir kommt es oft nicht 
auf echte Effizienz an, sondern mehr um Übersichtlichkeit und 
Wartbarkeit des Codes.



(7) Weiterhin habe ich noch nicht verstanden warum man zwischen c und h 
Dateien trennt. Muss ich wirklich in jede Function mit in die h-Datei 
mit aufnehmen? Was passiert wenn ich es vergesse?

(8) Können beim Beenden einer Function auch mehrere Werte übergeben 
werden?

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> (1) Wie hilft man sich, wenn man eigentlich den boolscher Datentyp
> benötigt?
> Eine Variable kann den Wert wahr oder falsch einnehmen.
Variable vom Typ "bool" nehmen.

> Wie arbeitet man am besten mit float Variablen (single und double)?
Double kann der AVR-GCC nicht und behandelt sie wie floats. Floats 
kannst du normal benutzen, an Zahlen immer "f" anhängen: 12.35484f

> (3) Gibt es gute Mathebibliotheken?
libm.a => ist nativ eingebunden

> (4) Gibt es gute Bibliotheken um von dem einen Datentyp in den anderen
> Datentyp umzuwandeln.
Ja, der sog. Cast


> (5) Wie geht ihr mit Strings um, wenn es unter C keinen String-Datentyp
> gibt? Wie löst ihr einfache Stringdarstellung und Stringoperationen (wie
> z. B in Bascom oder LunAVR) mit Umwandlung der anderen Datentypen in
> Strings um umgekehrt
itoa, utoa usw.

> (7) Weiterhin habe ich noch nicht verstanden warum man zwischen c und h
> Dateien trennt. Muss ich wirklich in jede Function mit in die h-Datei
> mit aufnehmen? Was passiert wenn ich es vergesse?
Nee, nur wenn du sie außerhalb der c-Datei benutzen willst.

> (8) Können beim Beenden einer Function auch mehrere Werte übergeben
> werden?
Nein, hierfür übergibt man Pointer

: Bearbeitet durch User
Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Man tippt sowas wie „c bool“ in die Suchmaschine seiner Wahl, und 
findet dann z.B.
https://www.geeksforgeeks.org/bool-in-c/

2. Wenn es dafür keine Grund gibt, gar nicht. Ansonsten einfach 
verwenden.

3. Sind im Lieferumfang des Compilers enthalten.

4. Nein. Für die eingebauten numerischen Typen macht C das automatisch, 
für selbtsdefinierte Typen ist Handarbeit angesagt.

5. iota, sprintf, etc. Dazu die im Lieferumfang des Compilers 
mitgelieferten Standard-Stringfunktionen.

6. Die libs funktionieren alle irgendwie gleich. Wenn du eine nicht 
verstehst, verstehst du auch keine andere.

7. Hat was mit Definition, Deklaration, und Interfaces zu tun. Ist 
einfach so. Nimm es einfach erst mal so hin.

8. Einzeln nicht, aber per struct.

Näheres zu allen deiner Fragen steht in dem C-Buch deiner Wahl.

Du wirst eins brauchen, egal, ob auf toten Bäumen, oder online. Ohne die 
allereinfachsten Grundlagen zu kennen, geht es nicht.

Oliver

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> Ich mache momentan meine erste Gehversuche mit C und dem Atmel Studio 7
> und hätte hierzu einige Fragen.
> Bisher habe ich in den letzten Jahren meine ATMegas unter Assembler,
> Bascom und dann LunaAVR programmiert. Am PC arbeite ich unter Windows
> mit vb.net. Als Buch habe ich "AVR Mikrocontroller Programmierng in C"
> von Heimo Gaichler.

Dann lies am besten erst einmal das Buch und arbeite vorhandene 
Beispiele durch. Hilfreich ist, wenn man Deine Fragen anschaut, auch ein 
C-Buch.

Das man nach ersten Gehversuchen einen ganzen Haufen Fragen hat ist gut 
und normal. Allerdings sprengt der Umfang naturgemäß den Rahmen, in dem 
ich darauf eingehen will - schlicht wegen der Menge an Text, die zur 
Antwort notwendig wäre.
Das meiste, dass Du fragst, beantwortet eine C-Buch. Der Rest wird erst 
dann wichtig, wenn Du das einigermaßen beherrschst.


Zwei der einfachen Fragen beantworte ich hier aber doch vorab ganz grob:

> (1) Wie hilft man sich, wenn man eigentlich den boolscher Datentyp
benötigt?
Man verwendet die vorhandenen Datentypen also zweiwertige Typen oder 
eine C-Version, die so einen Typen definiert.

> (4) Gibt es gute Bibliotheken um von dem einen Datentyp in den anderen
Datentyp umzuwandeln.
Nein. C enthält bereits Operatoren um das zu erreichen. (Bei selbst 
definierten Typen ist die Vielfalt notwendigerweise so gross, dass man 
eventuell nötige Umwandlungen schneller selbst schreibt.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> (1) Wie hilft man sich, wenn man eigentlich den boolscher Datentyp
> benötigt?
> Eine Variable kann den Wert wahr oder falsch einnehmen.

Da nimmt man einen Ganzzahltyp. 0 ist falsch, alles andere wahr.
Seit 1999 gibt esa aber auch eine bool Typ im Standard

> (2) Wie arbeitet man am besten mit float Variablen (single und double)?

Benutzen. Im Hinterkopf behalten, dass sie ungenau sind.

> (4) Gibt es gute Bibliotheken um von dem einen Datentyp in den anderen
> Datentyp umzuwandeln.

flot, double von/nach Ganzzahl unterstützt der Standard

> (5) Wie geht ihr mit Strings um, wenn es unter C keinen String-Datentyp
> gibt? Wie löst ihr einfache Stringdarstellung und Stringoperationen (wie
> z. B in Bascom oder LunAVR) mit Umwandlung der anderen Datentypen in
> Strings um umgekehrt

Die Erfinder von C haben auch eine Stringbehandlung eingeführt.
Diese arbeitet mit nullterminierten char-Arrays und ist allgemein als 
C-String bekannt

> (7) Weiterhin habe ich noch nicht verstanden warum man zwischen c und h
> Dateien trennt. Muss ich wirklich in jede Function mit in die h-Datei
> mit aufnehmen? Was passiert wenn ich es vergesse?

Das brauchst du, wenn du mehrere Quellcodes bzw. Bibliotheken nutzt.
In der .h steht alles das drin, was andere Quelltexte brauchen.
Sollte bei der Lib von POeter Fleury auch so sein.

> (8) Können beim Beenden einer Function auch mehrere Werte übergeben
> werden?

mittels struct oder Pointer

Autor: W.S. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> (1) Wie hilft man sich, wenn man eigentlich den boolscher Datentyp
> benötigt?
> Eine Variable kann den Wert wahr oder falsch einnehmen.

Der kleinste Datentyp dafür ist char: entweder 0 (=false) oder nicht 0 
(=true). Da das mißverständllich ist, kann man sich das selbst machen 
per
#define bool char
wenn das nicht schon irgendwo anders gemacht wurde.
Es ist in C ein ausgesprochenes Ärgernis in der Sprachdefinition, daß 
char gleichbedeutend ist mit einem Integerwert, daß also keine Trennung 
existiert zwischen numerischen Typen und Textzeichen. Damit muß man 
leben.

> (2) Wie arbeitet man am besten mit float Variablen (single und double)?

Na eben benutzen. Je nach Chip-Typ mag das von der Hardware unterstützt 
sein oder nicht.

> (3) Gibt es gute Mathebibliotheken?

Was verstehst du darunter? Komplexe Daten (re + im)? Oder 
Approximationen, Fouriertransformationen und dergleichen? Sowas ist 
eigentlich sprachunabhängig und nach Suchen auch für C zu kriegen.

> (4) Gibt es gute Bibliotheken um von dem einen Datentyp in den anderen
> Datentyp umzuwandeln.

Im Gegensatz zu den strengeren Typregeln bei Pascal ist das bei C lax 
gehandhabt. Ein single einem long zuweisen geht kommentarlos, man muß 
lediglich sich merken, daß dabei der gebrochene Teil einfach 
abgeschnitten wird. Also kein long=round(float)

> (5) Wie geht ihr mit Strings um, wenn es unter C keinen String-Datentyp
> gibt? Wie löst ihr einfache Stringdarstellung und Stringoperationen (wie
> z. B in Bascom oder LunAVR) mit Umwandlung der anderen Datentypen in
> Strings um umgekehrt

C kennt keine Strings im Sinne von Basic oder Pascal, sondern nur 
Arrays, die mehr oder weniger voll mit char's sein können, wobei das 
Ende mit einem byte vom Wert 0 gekennzeichnet ist. String-Operationen 
gibt es nicht. Stattdessen gibt es einiges an Bibliotheks-Funktionen wie 
strstr, strlen, strcat und so weiter.

> (6) Welche Ausgaberoutinen/Bibliotheken mit Fifo über Uart haben sind
> bewährt? Ganze Zahlen, Dezimalbrüche und Strings oder ein Gemisch von
> ihnen?

Trenne das. Serielle Ströme wie das, was durch einen UART geht, sind 
immer eine Übertragung von Zeichen, also char's. Ein Lowlevel-Treiber 
für UART's soll also einzelne Zeichen (char) entgegennehmen und liefern. 
Alles Andere soll separat da drauf gesetzt werden, also irgendwelche 
Umwandlungen vom/ins Textformat erledigen und das der Ausgaberoutine 
liefern.
Also nochmal: Zahlenkonvertierungen gehören nicht in Ausgaberoutinen.


> Gibt zu den Fragepunkten gute und bewährte Bibliotheken und vielleicht
> auch Beispiele? Wie löst ihr solche Probleme? Bei mir kommt es oft nicht
> auf echte Effizienz an, sondern mehr um Übersichtlichkeit und
> Wartbarkeit des Codes.

Ja, es gibt bei vielen Leuten gute und bewährte Code-Stücke und Units, 
die sie in ihrem persönlichen Portfolio haben. Auch bei mir. Aber da 
gehen die Ansichten auseinander. Viele sind zu doof oder zu faul oder zu 
"gläubig" und trauen sich nicht, irgend etwas SELBST zu tun.
Aber: Je mehr man sich auf Fremdcode verläßt, desto mehr muß man an 
Anpaßarbeiten an's eigene Projekt leisten.

> (7) Weiterhin habe ich noch nicht verstanden warum man zwischen c und h
> Dateien trennt. Muss ich wirklich in jede Function mit in die h-Datei
> mit aufnehmen? Was passiert wenn ich es vergesse?

Das ist hier schon x-mal erläutert worden. Also lies das Forum.
C hat keinerlei Unit-System. Ersatzeshalber werden all die Dinge, die 
andere Programmteile benötigen, um die Leistungen einer C-Quelle in 
Anspruch zu nehmen, als Verweise in eine Include-Datei geschrieben. Die 
wird i.Allg. mit .h als Endung versehen. Ist aber reine Konvention und 
im Grunde dem Compiler egal.

Damit keine Diskrepanzen zwischen den Verweisen oder Prototypen in der 
.h und dem eigentlichen "beef" in der .c entsteht, inkludiert man die .h 
normalerweise auch in deren zugehörige .c - hierbei spielt es keinen 
Leierkasten, daß die Dinge in der .h als "extern" deklariert sind.


> (8) Können beim Beenden einer Function auch mehrere Werte übergeben
> werden?

Nein. Wenn man so etwas will, muß man sich einen Datentyp schaffen, der 
mehrere Dinge enthält. Eben einen struct. So etwas kann man als Ergebnis 
einer Funktion liefern. Möglicherweise gibt es hier aber chipspezifische 
Einschränkungen.

W.S.

Autor: Joern DK7JB .. (moin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S.
>> (6) Welche Ausgaberoutinen/Bibliotheken mit Fifo über Uart haben sind
>> bewährt? Ganze Zahlen, Dezimalbrüche und Strings oder ein Gemisch von
>> ihnen?
>
> Trenne das. Serielle Ströme wie das, was durch einen UART geht, sind
> immer eine Übertragung von Zeichen, also char's. Ein Lowlevel-Treiber
> für UART's soll also einzelne Zeichen (char) entgegennehmen und liefern.
> Alles Andere soll separat da drauf gesetzt werden, also irgendwelche
> Umwandlungen vom/ins Textformat erledigen und das der Ausgaberoutine
> liefern.
> Also nochmal: Zahlenkonvertierungen gehören nicht in Ausgaberoutinen.
>

Ich würde mich freuen, wenn ihr mir eines euer AVR-Programme in C zum 
Lernen zur Verfügung stellen würdet, bei dem Strings über Uart 
ausgegeben werden.



> Ja, es gibt bei vielen Leuten gute und bewährte Code-Stücke und Units,
> die sie in ihrem persönlichen Portfolio haben. Auch bei mir. Aber da
> gehen die Ansichten auseinander. Viele sind zu doof oder zu faul oder zu
> "gläubig" und trauen sich nicht, irgend etwas SELBST zu tun.

Da mag ich dir nicht wiedersprechen. Aber mir helfen solche Programme 
ungemein, wenn ich nachvollziehen kann wie andere ein Problem gelöst 
haben.
Daher nochmals über sinnvollen Code oder kleine Programm zum Lernen 
würde ich mich sehr freuen  - Kontakt auch gerne über PN
... Und das soll nicht mit "zu doof oder zu faul " zu tun haben. 
Beispiele würden die Lernkurve bei mir enorm erhöhen.
Zu Anfang sind eben überall große Hürden (auch wenn das normal ist ;-) 
).


Auch wenn im Forum immer mal wieder gefragt wurde. Könnt ihr persönlich 
ein bestimmtes aktuelles C-Buch empfehlen, welches wirklich gut ist (in 
deutscher Sprache)?

Autor: Ingo L. (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> Ich würde mich freuen, wenn ihr mir eines euer AVR-Programme in C zum
> Lernen zur Verfügung stellen würdet, bei dem Strings über Uart
> ausgegeben werden.
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
Google kaputt?

Autor: Joern DK7JB .. (moin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein Google ist nicht kapuut und ich bin auch nicht zu faul...
Dein Link hilft mir noch nicht wirklich weiter, er ist mir bekannt und 
er wurde auch schon vor meiner Fragestellung gelesen. Natürlich suche 
ich auch mit Suchmaschienen im Netz. Anfänger könne nur sehr schwer die 
Spreu vom Weizen trennen und sind daher oftmals auf Empfehlungen 
angewiesen. Daher habe ich um Beispielprogramme von euch gebeten.

Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> [...]
> Dein Link hilft mir noch nicht wirklich weiter, er ist mir bekannt und
> er wurde auch schon vor meiner Fragestellung gelesen. [...]

Hm. Dann schreibe vielleicht mal, was dieser Link konkret nicht für 
Dich klärt. Welche Frage offen bleibt.

Du schreibst:
> Welche Ausgaberoutinen/Bibliotheken mit Fifo über Uart haben
> sind bewährt?
"Bewährt" ist vermutlich nicht das treffende Wort.
Für mich heisst das, es funktioniert und nachdem es häufig angewendet 
worden haben sich keine Fehler mehr gezeigt.
Meinst Du das so? Oder wie sonst?
Dazu muss man wissen, dass einem alten Ausspruch nach, jede Software 
fehlerhaft ist.

Dann schreibst Du:
> Ganze Zahlen, Dezimalbrüche und Strings oder ein Gemisch von
> ihnen?

, was einen Zusammenhang zwischen "bewährt" und Datentypen bzw. 
Interpretation von Daten herstellt.
Das ist aber etwas merkwürdig, denn es gibt gar keinen solchen 
Zusammenhang und, obwohl es prinzipiell möglich ist, dass neue Typen 
erfunden werden, für die vorhandener Code sich noch nicht "bewährt" hat, 
ist das doch vom Standpunkt eines Anfängers aus, eher unwichtig. Was 
meinst Du dazu?

Du hast ja nun schon einen Code angeschaut. Den verstehst Du nicht.
> Die Bibliothek von Peter Fleury habe ich ausprobiert. Ich habe
> aber noch nicht verstanden, wie man mit ihr Zeichenfolgen
> ausgeben kann.

Es wäre wünschenswert, wenn Du da eine genaue Referenz angibst.
Nun, jedenfalls hast Du Dir Code angesehen und verstehst ihn nicht. OK. 
Das kann vorkommen. Aber ohne zu wissen, was Du nicht verstehst, kann 
man Dir nur raten im Internet nach anderen Code zu suchen, bis Du einen 
findest, den Du verstehst.
Wir wissen ja gar nicht, was für Kriterien für Dich relevant sind. Und 
"bewährt" passt nun irgendwie nicht zu Deinem Kenntnisstand, wie ich 
oben schon erwähnte.

Kurz: Ich weiss eigentlich, trotz Nachdenken nicht, worauf Du eigentlich 
hinaus willst.

So vom Gefühl her, meine ich, Du willst "es richtig" machen, von Anfang 
an. Daher "bewährt". OK.
Leider ist das ein Anspruch, der aus meiner Sicht nicht sinnvoll ist. 
Denn es gibt keine Garantie, dass irgendeine Darstellung vollständig 
korrekt ist. Vielmehr ist in diesem Fach, wie in allen anderen, eine 
ständige Näherung, ein ständiges Lernen notwendig. Alle Erkenntnis wird 
beim Fortschreiten immer wieder ergänzt oder sogar umgeworfen. Zwar gibt 
es dabei immer wieder kehrende Elemente, aber das sind eher ganz 
einfache Dinge. In der Realität ist jedes neue Programm wie eine neue 
Schöpfung. Jedes neue Programm von ein und dem selben Programmierer ist 
(wenigstens ein bisschen) anders, weil jedes Problem anders ist.

Auf der Suche nach der ultimativen, der reinen Lehre wirst Du Dich 
verzetteln und letztlich scheitern.

Ich würde empfehlen, erst einmal die Grundlagen zu lernen. Und in den 
üblichen C-Büchern sind genug Beispiele vorhanden, die auch relativ 
einfach sind.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> Dein Link hilft mir noch nicht wirklich weiter, er ist mir bekannt und
> er wurde auch schon vor meiner Fragestellung gelesen

Was daran verstehst Du denn nicht?

Autor: Joern DK7JB .. (moin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, dann greife ich eure Anregungen auf und versuche meine Hausaufgaben 
zu machen. Ich werde ein kleines Programm erstellen mit einer Ausgabe 
über UART. Auch die Quellen werde ich angeben. Dann kann ich meine 
Frage(n) sehr viel konkreter stellen und ihr habt es leichter mit einer 
Antwort. Vermutlich waren meine Fragen bisher auch zu 'globalgalaktisch' 
;-).
Gebt mit bitte etwas Zeit.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joern DK7JB .. schrieb:
> bei dem Strings über Uart ausgegeben werden.

Du solltest erstmal C-Strings verstehen.
Dann ist dir das sofort klar.

Das geht auch am PC.

Autor: Joern DK7JB .. (moin)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun ein kleines Projekt mit meinen Versuchen erstellt. Die 
Fragen habe ich gleich in den Programmcode geschrieben. Vermutlich ist 
es so am einfachsten. Der Code ist lauffähig.
Ich würde mich freuen, wenn ihr euch den Code mal ansehen und 
kommentieren oder ergänzen würdet.

Als UART Bibliothek habe das Original von Peter verwendet.
Link: http://homepage.hispeed.ch/peterfleury/avr-software.html

Lauffähig soll der Code späer sein für den ATMEGA644P und ATMega328P.
Die "verbesserte" Version der Bibliothek kommt mit dem ATmega644P nicht 
zurecht. Der Grund ist mir noch unbekannt. Ich habe auch nicht 
verstanden wie der Controller-Typ übergeben wird. Das ist vielleicht das 
Problem.
Link: http://beaststwo.org/avr-uart/index.shtml


Die letzten Beiträge von euch haben meine Suche nach der "richtigen 
Lösung" gut beschrieben ;-)
Eigentlich suche ich soetwas wie der Print-Befehl von Bascom oder 
deutlich schneller wie der von LunaAVR ;-) Es ist schwer sich von 
gewohnten Bequemlichkeiten zu trennen :-(


P.S. zwei weitere Bücher sind bestellt.

: Bearbeitet durch User
Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.
#include "uart.h"   // hier < > oder " " verwenden?

Das kommt drauf an, wo die betreffende Datei zu finden ist.

Dateien, die mit Spitzklammern eingebunden werden, werden im sogenannten 
"Include-Pfad" gesucht, Dateien, die mit Anführungszeichen eingebunden 
werden, werden dort gesucht, wo die betreffende Quelldatei liegt.

In Deinem Beispiel liegen also main.c und uart.h im gleichen 
Verzeichnis.
  // Problem: Ausgabe von "Hallo Welt!"
  // Wie bekomme ich die Worte in das buffer-Array? Gibt es daf¸r eine elegante Mˆglichkeit?

Du könntest uart_puts mit der Stringkonstanten aufrufen:
uart_puts("Hallo Welt!");

Du könntest aber auch mit einer der Stringfunktionen die Konstante in 
das Array "buffer" kopieren und dann uart_puts so aufrufen, wie in 
Deinem Quelltext.

Die Stringfunktion ist eigentlich strcpy, aber die ist hochgradig 
gefährlich.

Das hat mit der Art der Interpretation von char-Arrays als Strings zu 
tun. Wie Dir aufgefallen sein könnte, wird der Funktion "uart_puts" nur 
das auszugebende Array (genauer: ein Pointer auf dessen erstes Element) 
übergeben, nicht aber die Länge des Arrays oder die Anzahl der daraus 
auszugebenden Zeichen.

Woher weiß "uart_puts" nun, wann es mit dem Ausgeben aufzuhören hat?

Die in C übliche Konvention ist es, das Ende eines Strings mit einem 
besonderen Zeichen zu kennzeichnen, das ist '\0'. Das ist nur ein 
Zeichen, nicht zwei Zeichen "\" und "0" (Stichwort zum Nachlesen in 
Deinem C-Buch: Char-Konstanten und "escaping" von Sonderzeichen).

Dein Array enthält Platz für 20 Elemente, das bedeutet, daß es Platz für 
19 darstellbare Zeichen enthält, denn das Ende des Array muss 
gekennzeichnet werden.

Wenn Du nun strcpy verwendest, und damit versehentlich einen Text 
kopierst, der länger ist als diese 19 Zeichen, dann knallt es.

strcpy kann zwar herausfinden, wie lang der Text ist, den Du als Quelle 
angibst, nicht aber, wieviel Platz im Ziel zur Verfügung steht.


Deswegen gibt es strncpy, das ist ein um ein Längenargument 
erweitertes strcpy. Dem wird mitgeteilt, wie viele Zeichen kopiert 
werden können.

Allerdings ist strncpy wiederum selbst auch gefährlich, denn es verhält 
sich anders, als man erwartet ...

Stichwort für Recherche für Dich: Unterschied zwischen strncpy und 
strlcpy

  // Problem: Ausgabe der float-Variablen c=4.345
  // ???
  // oder so etwas wie PRINT "Messung Nr" & num & "   " Wert:" & "  c            Also Test plus float-Messwert
  // Also Integer und Float in String umwandeln und alle mit weiteren Strings zusammenf¸hren

C kennt hierfür printf ("print formatted"), das es auch in einer 
Variante gibt, die als Ausgabeziel ein char-array nutzt.

Dieser Funktion wird ein Formatstring, gefolgt von den auszugebenden 
Variablen übergeben.

Allerdings ist diese Funktion sehr "mächtig", weil sie sehr feine 
Formatierungsmöglichkeiten zulässt, und somit viel Codespeicher belegt.

Manche Programmierer scheuen sich daher, diese Funktion zu verwenden, 
und basteln sich für ihre Anwendungsfälle geeignetere Funktionen, die 
weniger Codespeicher belegen, weil sie nur bestimmte Teilfunktionen 
erfüllen.

Hier ein Beispiel, wie der Gebrauch der /printf/-Funktion für Deine 
Anwendung aussehen könnte:
  // oder so etwas wie PRINT "Messung Nr" & num & "   " Wert:" & "  c            

        printf("Messung Nr %d  Wert: %.2f\n", num, c);

(ich habe hier bewusst nicht die variante verwendet, die ihre Ausgabe in 
einem char-Array unterbringt)

: Bearbeitet durch Moderator
Autor: Theor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Joern

Tja. Also. Nun. ...

Es ist gut, dass Du Code geliefert hast. Sehr schön. Lobenswert.
Auch das mit der C und H-Datei hast Du richtig gemacht. Sehr schön.

Aber: ...

Deine Fragen deuten auf zweierlei hin.
Erstens: Wiederhole ich meinen Rat zunächst einmal mit einem C-Buch 
anzufangen. Du stellst Fragen, die dort erklärt sind. Und es sind 
wirklich Dinge, die ziemlich einfach sind und vermutlich (je nach Buch) 
auch ziemlich nahe am Anfang erklärt werden. Das bezieht sich auf: Wie 
kriegt man einen String in einen Buffer bzw. siehe meinen nachfolgenden 
Rat.

Zweitens: Füge ich einen zweiten Rat meinem ersten hinzu. Lies den 
Quelltext test_uart.c nochmal. Dort siehst Du ein Beispiel für den Fall, 
nach dem Du fragst.
Ein bissl flexibel musst Du halt sein im Kopf. Wenn dort mal nicht 
"Hello world" steht sondern ein anderer String, dann kann man dennoch 
(erstmal) vermuten, dass die dort zu sehende Ausgabe auch mit "Hello 
World" funktionieren könnte. :-)

Du kannst ja nichts kaputt machen. Probiers einfach aus. Es muss auch 
nicht auf Anhieb klappen. Dann versuchst Du's nochmal.


Was die Auswahl des uC im AVR-Studio 7 betrifft, kann ich leider nichts 
Konkretes sagen. Ich bin ein Version-4-Fan. Allerdings wird das irgendwo 
in der Beschreibung stehen; der Bedienungsanleitung. Vermutlich ziemlich 
am Anfang. Vielleicht gibt es so ein Kapitel wie "Quick Start" oder so.

Als Bonus noch ein dritter Rat: Beschränke Dich nie nur darauf zu sagen, 
das irgendwas nicht funktioniert oder darauf, dass irgendein Code "nicht 
akzeptiert wird". Gib immer an, was genau geschieht; woran Du siehst, 
dass was nicht klappt. Wenn Fehlermeldungen ausgegeben werden, gib sie 
an und zwar im Wortlaut.

Viel Erfolg.

Autor: Joern DK7JB .. (moin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank. Ich habe eure vielen Beiträge sehr aufmerksam gelesen. Sie 
haben mir sehr geholfen und ich werde mir euren Rat zu Herzen nehmen.

>> Lies den Quelltext test_uart.c nochmal.
Arrg. Manchmal sieht man den Wald vor lauter Bäumen nicht ;-)

Dieser ganze Thread ist entstanden, da mir mein erstes Buch und die 
Seiten die ich im Internet gelesen hatte nicht weiterhelfen konnten. Nun 
sind zwei reine C-Bücher bestellt, die aber erst nach dem langen 
Wochenende kommen. Hoffentlich werden sie mir weiterhelfen.
Das Buch "AVR-Mikrocontroller Programmierung in C" von Heimo Gaicher ist 
gut für den Einstieg und die hardwarenahen Informationen. Letztlich geht 
es nicht weit genug in die Tiefe, was aber auf den rund 350 Seiten 
vermutlich auch gar nicht möglich ist - daher auch dieser Thread.
Auf dem Postweg sind nun: "C von A bis Z" von Jürgen Wolf und "Einstieg 
in C" vom Thomas Theis.

Vermutlich können wir diesen Thread nun schließen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.