-
        

Ergebnis 1 bis 10 von 10

Thema: serieller(UART) Zeilenumbruch flexibler gestalten unter C

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.121
    Blog-Einträge
    1

    serieller(UART) Zeilenumbruch flexibler gestalten unter C

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo Freunde !
    Ich muss mal wieder in die Runde fragen. Es geht mir um die Ausgabe einer neuen Linie über den UART beim PIC.

    Ich bewerkstellige das zZt etwa so:

    Code:
    #define BD_RATE 9600 // Baudrate
    
    #include <xc.h>
    #include "uart.h"
    //***************************************************************
    void main(void) {
        UART_Init(BD_RATE);
        while(1){
        UART_Write_Text(" Mein Text\r\n"); // "\r\n" = Neue Zeile
        __delay_ms(1000);}
        return;
    }
    
    //***************************************************************
    
    void UART_Write_Text(char *text)
    {
      int i;
      for(i=0;text[i]!='\0';i++)
      {
          UART_Write(text[i]);}
      
    }
    
    //***************************************************************
    
    void UART_Write(char data)
    {
      while(!TRMT);
      TXREG = data;
    }
    
    //***************************************************************
    Ich komme einfach nicht dahinter, wie ich einen Zeilenumbruch flexibler einsetzen kann.

    Es ist doch unpraktisch, immer "\r\n" in den zu schreibenden String etc. einzufügen, besonders wenn man Werte von Variablen schreiben möchte.

    Kann mir da mal wer "in den Achtersteven treten" ,um mich gedanklich anstossen ??

    Gruss und Dank

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Hallo,
    am einfachsten fügt man in die Write_Text Methode einfach noch \r und \n mit ein:

    Code:
    void UART_Write_Text(char *text) //kann man natürlich auch umbenennen
    {
      int i;
      for(i=0;text[i]!='\0';i++)
      {
          UART_Write(text[i]);}
      UART_Write(13); // ist \r
      UART_Write(10); // ist \n
    }
    Grüße,
    Bernhard
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    60
    Beiträge
    2.435
    @Gerhard

    Es ist doch unpraktisch, immer "\r\n" in den zu schreibenden String etc. einzufügen, besonders wenn man Werte von Variablen schreiben möchte.
    Der Compiler ersetzt "\r" und "\n" mit den entsprechenden Steuercodes.
    Wie Bernhard gezeigt hat kann man
    UART_Write_Text(char *text);
    und
    UART_Write_Text_NL(char *text);
    verwenden.


    @Bernhard

    Code:
    void UART_Write_Text(char *text) //kann man natürlich auch umbenennen
    {
      int i;
      for(i=0;text[i]!='\0';i++)
      {
          UART_Write(text[i]);}
      UART_Write(13); // ist \r
      UART_Write(10); // ist \n
    }
    Das ist nicht ganz sauber so, man sollte besser
    Code:
      UART_Write('\r');
      UART_Write('\n');
    Der Compiler übernimmt dann die Übersetzung in den passenden Steuercode.
    Den Unterschied merkt man aber erst dann, wenn man einen anderen Zeichensatz als ASCII verwendet.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.121
    Blog-Einträge
    1
    Ich danke Euch beiden für "Den Tritt in den Achtersteven"....

    Berhard's Beispiel hatte ich schon probiert nur eben fehlte das "\n" bzw.. chr10....
    Das ich den Code auch so schreiben kann:
    Code:
    UART_Write('\r');
    UART_Write('\n');
    wusste ich noch nicht..ist ja auch Compiler abhängig....

    Euch Beiden nochmals vielen Dank

    Gruss

    Gerhard

    Klicke auf die Grafik für eine größere Ansicht

Name:	usart_pic_terminal.png
Hits:	3
Größe:	5,9 KB
ID:	32715
    Geändert von oderlachs (01.07.2017 um 10:19 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.616
    .. Das ich den Code auch so schreiben kann .. wusste ich noch nicht .. ist ja auch Compiler abhängig ..
    Soweit ich weiß gibts Compiler?? und/oder Terminals?? die so nen AutoLinefeed haben - evtl. wählbar mit z.B. [CR=LF]. Da reicht dann ein simples \r . Bei meinen Compilern (Studio4/Winavr bzw. Studio7) schreib ich fürs br@y-Terminal immer nur "\r".
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    60
    Beiträge
    2.435
    Hallo Gerhard,

    wusste ich noch nicht..ist ja auch Compiler abhängig....
    Nein, das ist Standard-C, gab es schon in K&R.

    "Text" ergibt einen String, welcher mit \0 terminiert ist.
    't' ist ein einzelnes Zeichen und es gibt kein \0 am Ende.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.121
    Blog-Einträge
    1
    Ja Peter ich glaube es Dir...wir hatten wir ja in der Programmierausbildung auch so gelernt ...damaaaals. Aber das was alles MS-C/C++ da war doch einiges anders...und vieles vergessen...
    ...auch die XC8/16 Compiler(Mircrochip) sind für mich als Einsteiger in PIC doch noch etwas gewöhnungsbedürftig....na ja man lernt ja dazu.

    Gruss
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    60
    Beiträge
    2.435
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Soweit ich weiß gibts Compiler?? und/oder Terminals?? die so nen AutoLinefeed haben - evtl. wählbar mit z.B. [CR=LF]. Da reicht dann ein simples \r . Bei meinen Compilern (Studio4/Winavr bzw. Studio7) schreib ich fürs br@y-Terminal immer nur "\r".
    Das liegt am Betriebssystem.
    CRLF kommt noch von den alten TTY, die Fernschreiber brauchten da einzelne Befehle.
    Die Drucker übernahmen das dann.
    Damals war dann Fettschrift mit mehrmaliger Ausgabe des selben Textes mit nur einem CR.

    Unter Unix/Linux wird normal nur CR verwendet. Der Treiber expandiert dies dann zu CRLF.
    Allerdings kann man den Treiber über Befehle konfigurieren. Will man binäre Daten übertragen, stört das automatische expandieren. Die einfachste Variante ist bei open(); den b-Parameter anzugeben (b = binary).

    MS war so ein Treiber scheinbar zu komplex, der kann seit DOS nicht automatisch expandieren.

    MfG Peter(TOO)

    - - - Aktualisiert - - -

    Hallo Gerhard,

    Bei meinem " ...damaaaals." gab es MS-C/C++ noch gar nicht. Da hatte MS erst BASIC im Verkauf.
    Meine ersten 10 Jahre bestanden aus diversen BASIC und Assembler (6502, 8080 und Z80). C kam dann bei mir erst 1986 dazu.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.121
    Blog-Einträge
    1
    Nun Peter, bis 91 war ich nur vom HF-Bazillus infiziert...die Bits und Bytes kamen dann so 1992....mit dem C64...AT8085(ASSR/BASIC/Pascal) usw... Ich liege in Sachen PC wohl so 10 Jahre hinter Dir...
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    60
    Beiträge
    2.435
    Zitat Zitat von oderlachs Beitrag anzeigen
    Nun Peter, bis 91 war ich nur vom HF-Bazillus infiziert...die Bits und Bytes kamen dann so 1992....mit dem C64...AT8085(ASSR/BASIC/Pascal) usw... Ich liege in Sachen PC wohl so 10 Jahre hinter Dir...
    HF war nie wirklich mein Ding. Mich faszinierte Analog und Digital mehr. Fundierte HF-Grundlagen habe ich, die benötigte man damals auch um 74Sxx-Schaltungen fehlerfrei zum laufen zu bringen.
    Mein Onkel hatte ab 1972 einen Wang 2200, für seine Buchhaltungen als Treuhänder. Damals habe ich Klingonen abgeschossen, natürlich mit reiner ASCII-Graphik.
    Und 1976 musste ich dann an die Mikroprozessoren ran. Mein damaliger Lehrmeister kam auch an der HF und fand digital langweilig. Folglich wurde ich dazu "verknackt" die µP zu betreuen. Wie bekamen damals ein Projekt eines Geldspielautomaten, welches ein Software-Typ entwickelt hatte, leider auch die Hardware. Das Hauptproblem war, dass wenn der Auszahl-Magnet angesteuert wurde, der µP immer aus dem Programm flog. Nach dem Einbau von 220nF und 100nF am 7805 hat es dann funktioniert.
    Ich musste dann das ganze Hardwarekonzept überarbeiten und im Netzteil waren noch ein paar grobe Fehler.
    Und am Schluss wurde ich dazu verdonnert die Testprogramme für die Hardware auf einem KIM-1 zu schreiben.

    Das nächste war dann BASIC, da habe ich einen Cross-Assembler für den 6502 auf dem Wang geschrieben.

    1978 kam dann ein S100-Bus System mit CP/M 1.4, 8080 Assembler und CBASIC hinzu. Und etwas später ein Apple][ mit DOS, später UCSD-Pascal und Z80-Karte mit CP/M 2.2.

    So sammelt sich etwas Wissen mit der Zeit.
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

Ähnliche Themen

  1. Zeilenumbruch via RS232
    Von Atvilar im Forum Software, Algorithmen und KI
    Antworten: 1
    Letzter Beitrag: 13.09.2013, 18:27
  2. Serielle UART mit C++ Abfragen unter Linux
    Von Celaeno im Forum Arduino -Plattform
    Antworten: 3
    Letzter Beitrag: 30.01.2013, 08:18
  3. Zeilenumbruch Display LCD
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 11
    Letzter Beitrag: 08.10.2009, 23:31
  4. Zeilenumbruch
    Von habunus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 09.11.2007, 09:08
  5. Programm interruptgesteuert gestalten
    Von daiyama im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 02.02.2005, 20:01

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •