String empfangen mit PIC18F und XC8

OP #6526658
Lesenswert?

Hallo Zusammen,

ich versuche gerade einen String über den USART einzulesen. Das PC 
Programm tut was es soll.

Der PIC antwortet, wenn nur mit Schrott. Wenn ich einen Teststring 
manuell erstelle und versende funktioniert die Schnittstelle. Es muss 
also folglich was mit der Deklaration bzw. etwas mit dem Einlesevorgang 
zu tun haben.

Der String besteht aus 38 Zeichen (siehe Bild). Nach der Durchsicht 
meiner C-Unterlagen und des String Artikels hier habe ich n alle 
möglichen für mich vorstellbaren Varianten durchgespielt.Ich komme nicht 
auf den richtige Lösung. Kennt jemand die Lösung?
1
// C-Code Auszüge
2
aus dem USART Programm
3

4
void USART_Write_String(char *text)
5
{
6
  int i;
7
  for(i=0;text[i]!='\0';i++)
8
    USART_Write(text[i]);
9
}
10

11
void USART_Write(uint8_t txData)
12
{
13
    while(0 == PIR1bits.TX1IF)
14
    {
15
    }
16

17
    TXREG1 = txData;    // Write the data byte to the USART.
18
}
19

20
void USART_Read_String(char *Output, unsigned int length)
21
{
22

23
    unsigned int i;
24
    for(int i=0;i<length;i++)
25
    {    
26
        Output[i] = USART_Read();
27

28
        if ((Output[i] == '\r') || (Output[i] == '\r'))
29
        {
30
            Output[i] = '\0';
31
            break;
32
        }
33
    }
34
    //Output[i+1] = '\0';
35
}
36

37
uint8_t USART_Read(void)
38
{
39

40
    while(!PIR1bits.RC1IF)
41
    {
42
    }
43

44
    if(1 == RCSTA1bits.OERR)
45
    {
46
        // EUSART1 error - restart
47

48
        RCSTA1bits.CREN = 0; 
49
        RCSTA1bits.CREN = 1; 
50
    }
51

52
    return RCREG1;
53
}
54

55

56
aus Main.c
57

58
//Deklarationen
59
   char chr_Temp[40];
60
   static char *chr_Data_1[40];
61
   char *chr_Data_2[40];
62
   char *chr_Data_3[40];
63
 while(1)                    // Ganzes Programm ist Endlosschleife
64
 {     
65
    memset(chr_Data_1, 0x20, 40);
66
    USART_Read_String(chr_Data_1,37);
67
    USART_Write_String(chr_Data_1);
68
    LcdPrintf(4, 1, chr_Data_1);
69
    USART_Write_String("\r\n");
70
}

Viele Grüße
Ingo
Angehängte Dateien:
Gast #6527337
Lesenswert?

Also uch würde zum Empfangen eine Strings einen einfachen char Buffer 
nehmen. So etwas wie
char Buffer[40];

So wie ich C kenne bedeutet
char *chr_Data_1[40];
ein Feld von 40 Char-Pointern. Wozu braucht man einen Poiner auf jedes 
Zeichen? Das geht doch einfacher?
Oder bin ich jetzt falsch, weil ich neueste C-20 Features nicht kenne?


Auch werden die Pointer durch
memset(chr_Data_1, 0x20, 40);
mit ziemlichen Mist initialisiert.

Eigentlich müßte der Compiler doch auch einen Haufen Warnungen ausgeben?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren