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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.