Forum: Mikrocontroller und Digitale Elektronik String empfangen mit PIC18F und XC8


von Ingo S. (schicki)


Angehängte Dateien:

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

von PittyJ (Gast)


Lesenswert?

Du weisst, was das hier erzeugt?

static char *chr_Data_1[40];

von Ingo S. (schicki)


Lesenswert?

Grundsätzlich ja. Durch das viele Testen von verschiedenen 
Möglichkeiten.

das ist klar aber auch wenn der nicht static ist, geht das nur einmal 
und dann die wieder wegen eigen Overflow...


erzeugen einer static-Variablen mit Anfangswert 0 */

von PittyJ (Gast)


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?

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
Noch kein Account? Hier anmelden.