Hallo, Ich habe die uart Lib von Peter Fleury eingebunden und's läuft. Ich würde jedoch gerne die while(*s) rausnehmen und ersetzen. Dabei würde ich gerne einen zu schreibenden string über einen ringbuffer übertragen. http://www.ssalewski.de/USB-Sources/ Wenn jetzt die while(1) durchlaufen wird, soll nun der erste char gesendet werden. Mit dem sendenErfolgreich-Interrupt soll dann ein weiter char des strings gesendet werden usw..., bis der string übertragen ist. Dadurch soll der prozessor während des langen (ms) übertragungsprozess wieder frei für andere Dinge sein. Ich hatte mir gedacht, dass ein solcher string im ram hinterlegt sein muss?? Habt ihr ne Idee wie ich das am besten anstelle?? Ich hab zwar den ringbuffer, aber wie kann ich den so einsetzen, dass der über einen string läuft?? Grüße
Ja. Du benutzt die Funktionen aus der UART-Library von Peter Fleury http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html Dort sind bereits zwei (Senden, Empfangen) Ringpuffer eingerichtet, die defaultmäßig je 32 Bytes gross sind. Die Grösse kann man aber auch anpassen (Defines in der Library). Zum Senden schreibst du in den Senderingpuffer einzelne Zeichen mit uart_putc rein und komplette Strings mit uart_puts. Alles weitere macht die Library.
Sorry, ich hab mich falsch ausgedrückt. Hier mal ein beispiel: Änderung der Stringfunktion aus Fleury-Lib(nur Bsp)
1 | char *s = "hallo"; |
2 | |
3 | void uart_puts(void) |
4 | {
|
5 | if(*s) |
6 | {
|
7 | uart_putc(*s++); |
8 | }
|
9 | |
10 | }/* uart_puts */ |
Aufruf durch main:
1 | void main(void) |
2 | {
|
3 | while(1) |
4 | {
|
5 | uart_puts(); |
6 | }
|
7 | }
|
Das problem ist jetzt, das die Adresse nicht mehr zurückgesetzt wird. Eventuell kommt auch noch ein weiterer String dazu, obwohl die übertragung noch nicht komplett ist. Daher wollte ich für das auslesen des Strings einen weiteren ringbuffer einsetzen. Ist das klug?? Wie stellt man das an?? Gruß
1/ Es ist nicht klug, eine Libraryfunktion mit definierter Argumentübergabe durch eine gleichnamige eigene Funktion mit geänderter Argumentübergabe zu ersetzen. 2/ In deinem 1. Beispiel hapert es, dass du einen globale Zeiger statt einem lokalen Funktionsargument benutzt. Klar, dass dadurch der globale Zeiger manipuliert wird. Die Ersatzfunktion sollte auch mit einem Argument arbeiten.
1 | char *s = "hallo"; |
2 | |
3 | void mein_uart_puts(char *s) |
4 | {
|
5 | if (s) // auf Nullpointer checken bevor Zugriff (*s) erfolgt |
6 | {
|
7 | while (*s) // ALLE Zeichen von s bis zum ersten Nullbyte ausgeben |
8 | {
|
9 | uart_putc(*s++); |
10 | }
|
11 | }
|
12 | }/* mein_uart_puts */ |
13 | |
14 | // Aufruf durch main
|
15 | int main (void) |
16 | {
|
17 | while(1) |
18 | {
|
19 | mein_uart_puts(s); // immer wieder Text "hallo" ausgeben |
20 | }
|
21 | return 0; |
22 | }
|
Innerhalb von mein_uart_puts wird das Funktionsargument s als Zeiger benutzt. Das ist ein lokaler Zeiger s, nicht der globale Zeiger s. Der globale Zeiger s bleibt ohne Änderung! http://www.roboternetz.de/wissen/index.php/C-Tutorial#G.C3.BCltigkeitsbereich Wenn du hier beim Gültigkeitsbereich von Zeigern (und Variablen) Verständnisprobleme hast, solltest du dir was Gutes tun und ein C Tutorial zu Rate ziehen. Längerfristig brauchst du das Verständnis, wenn du weiter C programmieren willst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.