Hallo,
ich möchte mit einem ATmega16 Daten über RS232 von einem PC verarbeiten.
Die Daten sind Strings, mit einer maximalen Länge von 6 (z.B. 'V12345').
Dazu habe ich folgendes (Unter)Programm geschrieben:
1 | void Main_Get_Uart_Analyse(void){
|
2 | unsigned int uiRXZeichen;
|
3 | unsigned int uiCount;
|
4 | char String[10];
|
5 | char s[10];
|
6 | uiCount = 0;
|
7 | uiRXZeichen = uart_getc();
|
8 | if (uiRXZeichen != UART_NO_DATA ){
|
9 | while( uiRXZeichen != UART_NO_DATA ){
|
10 | String[uiCount] = uiRXZeichen;
|
11 | uiCount++;
|
12 | uiRXZeichen = uart_getc();
|
13 | }
|
14 | String[uiCount] = '\0';
|
15 | // uart_puts(String); // wegen uart_puts_hex auskommentiert
|
16 | itoa(uiCount,s,10);
|
17 | uart_puts(s);
|
18 | uart_puts_hex(String); // Siehe Forum http://www.mikrocontroller.net/topic/57429#new
|
19 | }
|
20 | else{
|
21 | }
|
22 | }
|
Das Programm sollte einen String einlesen, und ihn gleich wieder
ausgeben.
Sende ich mit Br@y Terminal ein 'A' bekomme ich zurück:
1 41 A (wie erwartet).
| | ^--- Gesendetes Zeichen in ASCII (über Funktion uart_puts_hex)
| ^----- Gesendetes Zeichen in HEX
^-------- Wert der Zählvariable uiCount
(uart_puts_hex() siehe: Beitrag "anwendung uart_getc() von fleury")
Sende ich aber ein 'AB' bekomme ich '1 41 A 1 42 B' zurück. Erwartet
hätte ich aber '2 41 A 42 B'. Mir scheint, das mein Programm nur einen
String der Länge 1 einliest, und beim nächsten Programmdurchlauf das
nächste Zeichen.
Sende ich 'ABCDE' ist das Verhalten genauso. Ich bekommen '1 41 A 1 42 B
1 43 C 1 44 D 1 45 E' zurück.
Wie kann ich einen ganzen String einlesen, und nicht n mal 1 Zeichen?
Ich kann sonst nicht unterscheiden, wann ein String zu ende ist bzw. wo
der neue anfängt.
Der Mega16 läuft mit 11,0592MHz. Die Boud rate ist 19200. Programmier
mit 'WinAVR 20070525' und 'AVR Studio 4.12.498 Service Pack 4'
Ich sollte noch erwähnen, dass ich "Gelegenheitsprogrammierer" bin.
Meine Erfahrung geht daher eher gegen "wenig". Im diesem Forum habe ich
dieses Problem leider nicht gefunden.