Hallo Zusammen, Ich möchte mit Hilfe von printf Ausgaben auf beiden seriellen Schnittsellen des Mikrocontrollers machen. Mit einer Schnittstelle habe ich keine Probleme, ich habe einfach die Funktion sendchar() für eine Schnittstelle definiert und kann dann mit printf Ausgaben auf diese Schnittstelle machen. Wie kann ich aber mit printf Ausgaben auf beide Schnittstellen machen? Ich stelle mir das so vor, dass ich mit einem Argument angeben kann auf welche Schnittstelle printf schreiben soll. z.B.: printf(UART0, "Test1"); printf(UART1, "Test2"); Funktioniert so was, oder wie kann ich das am einfachsten realisieren? freundliche Grüße, Stefan
Hi schau dir mal den C-Befehl 'fprintf' an. Der könnte dich weiter bringen. mfg Stephan
Hallo! Vielen Dank schon mal für deine Antwort, nur komme ich trotzdem nicht weiter. Ich kenne die Fuktion fprintf() um in Dateien zu schreiben. Aber wie schaffe ich es nun auf die beiden seriellen Schnittstellen zu schreiben? Muss ich mit fopen() zuerst die Schnittstelle öffnen? Wenn ja, wie? -> fopen("UART0", "w"); ??? Hilf mir bitte ein bißchen auf die Sprünge, ich kann nichts finden, dass mir in dieser Sache weiterhilft. mfg Stefan
Was du willst ist eine Funktion, welche mit sprintf arbeiten. Schau dir variable Argumentenlisten an, mache deine printf, das erste Argument gibt an welcher UART und die restlichen werden 1:1 an sprintf weitergegeben. Der string der dabei entsteht geht dann per uart_puts() o.ä. raus. das sind keine 10 Zeilen Code. Wenn du selbst nich drauf kommst, kann ich dir später auch mal ein paar Codeschnipsel geben.
Hallo und Danke! in der Zwischenzeit hatt ich eine Idee... Ich habs inzwischen so realisiert: Damit printf Ausgaben auf die Uart macht, muss ich ja eine Funktion definieren -> sendchar()! Jetzt habe ich einfach die sendchar-Funktion erweitert: bevor ich printf() aufrufe setze ich eine globale Variable UART (Wert = 0 für UART0, Wert = 1 für UART1)! und senchar() sieht so aus:
1 | senchar (unsigned char ch) |
2 | {
|
3 | if (UART != 1) |
4 | {
|
5 | //sende an UART0
|
6 | }
|
7 | else
|
8 | {
|
9 | //sende an UART1
|
10 | }
|
11 | }
|
Danke für eure Hilfe!
Aber printf() ist was ganz anderes, das formatiert dir deinen string, daher ja das f am Schluss... So wie du das machst wird das wohl auf eine poplige uart_puts() herauslaufen, bei der einfach noch ausgewählt wird, welcher uart...
1 | void uart_puts(int uart, char *str) { |
2 | while(*str) { |
3 | putchar(uart, *str); |
4 | str++; |
5 | }
|
6 | }
|
Ich rate dir, lern erstmal die Grundlagen von C und mit einer C-Lib umzugehen, bevor du versucht die eine eigene auf Controllern zu bauen oder einfach mal ein wenig uC-C-Howtos durchlesen, das wurde das alles schon 24 mal durchgekaut.
Achja, nochwas ein switch/case ist in solchen Fällen oft besser als mehrere if-Abfragen, jenachdem wie gut der Compiler optimiert.
Hi hier mal ein Beispiel aus dem Netz, ich glaub das trifft eher was du suchst. Stephan
wenn kein Anhang möglich halt so:
1 | /*
|
2 | * ----------------------------------------------------------------------------
|
3 | * "THE BEER-WARE LICENSE" (Revision 42):
|
4 | * <joerg@FreeBSD.ORG> wrote this file. As long as you retain this notice you
|
5 | * can do whatever you want with this stuff. If we meet some day, and you think
|
6 | * this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
|
7 | * ----------------------------------------------------------------------------
|
8 | *
|
9 | * Stdio demo
|
10 | *
|
11 | * $Id: stdiodemo.c,v 1.1 2005/12/28 21:38:59 joerg_wunsch Exp $
|
12 | */
|
13 | |
14 | #include "defines.h" |
15 | |
16 | #include <ctype.h> |
17 | #include <stdint.h> |
18 | #include <stdio.h> |
19 | |
20 | #include <avr/io.h> |
21 | #include <avr/pgmspace.h> |
22 | |
23 | #include <util/delay.h> |
24 | |
25 | #include "lcd.h" |
26 | #include "uart.h" |
27 | |
28 | /*
|
29 | * Do all the startup-time peripheral initializations.
|
30 | */
|
31 | static void |
32 | ioinit(void) |
33 | {
|
34 | uart_init(); |
35 | lcd_init(); |
36 | }
|
37 | |
38 | FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); |
39 | FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE); |
40 | |
41 | static void |
42 | delay_1s(void) |
43 | {
|
44 | uint8_t i; |
45 | |
46 | for (i = 0; i < 100; i++) |
47 | _delay_ms(10); |
48 | }
|
49 | |
50 | int
|
51 | main(void) |
52 | {
|
53 | uint8_t i; |
54 | char buf[20], s[20]; |
55 | |
56 | ioinit(); |
57 | |
58 | stdout = stdin = &uart_str; |
59 | stderr = &lcd_str; |
60 | |
61 | fprintf(stderr, "Hello world!\n"); |
62 | |
63 | for (;;) |
64 | {
|
65 | printf_P(PSTR("Enter command: ")); |
66 | if (fgets(buf, sizeof buf - 1, stdin) == NULL) |
67 | break; |
68 | if (tolower(buf[0]) == 'q') |
69 | break; |
70 | |
71 | switch (tolower(buf[0])) |
72 | {
|
73 | default:
|
74 | printf("Unknown command: %s\n", buf); |
75 | break; |
76 | |
77 | case 'l': |
78 | if (sscanf(buf, "%*s %s", s) > 0) |
79 | {
|
80 | fprintf(&lcd_str, "Got %s\n", s); |
81 | printf("OK\n"); |
82 | }
|
83 | else
|
84 | {
|
85 | printf("sscanf() failed\n"); |
86 | }
|
87 | break; |
88 | |
89 | case 'u': |
90 | if (sscanf(buf, "%*s %s", s) > 0) |
91 | {
|
92 | fprintf(&uart_str, "Got %s\n", s); |
93 | printf("OK\n"); |
94 | }
|
95 | else
|
96 | {
|
97 | printf("sscanf() failed\n"); |
98 | }
|
99 | break; |
100 | }
|
101 | }
|
102 | fprintf(stderr, "Bye-bye"); |
103 | delay_1s(); |
104 | for (i = 0; i < 3; i++) |
105 | {
|
106 | putc('.', stderr); |
107 | delay_1s(); |
108 | }
|
109 | fprintf(stderr, "\n "); |
110 | |
111 | return 0; |
112 | }
|
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.