www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart sendet String nicht komplett


Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich arbeite derzeit mit einem LPC2148 auf dem MCB2140 Evalutaionboard 
von Keil, mein Compiler ist der ARM-elf-gcc. Mein Debugger ist HiTOP 
Version 05.32.0030.
Mein Problem ist, dass ich zwar über das UART Zeichen senden kann,
wenn ich jedoch einen String mit "transmit()" übertragen will, werden 
höchsten 16 Zeichen gesendet.
Wenn ich jedoch in di Funktion transmit() hinein springe und jeden 
Befehl einzeln ausführe, wird der String korrekt übertragen.
Hat jemand schonmal ein ähnliches Problem gehabt?

Gruß

Hier der Code:
#define UART1 7
#define TXEN 7
#define DLAB 7
#define UART_WORD_LENGTH0 0
#define UART_WORD_LENGTH1 1
#define BREAK_CONTROL 6

#define ENABLE_VIC_SLOT 5
#define TXD_UART1 16
#define RXD_UART1 18
#define TRANREGEMPTY 5        //Transmit Holding Register Empty

#define VICT_CNTL_NUM 0

#define REC_INT_EN 0
#define TRAN_INT_EN 1

#define TX_FIFO_RESET 2
#define RX_FIFO_RESET 1 
#define FIFO_ENABLE   0
#define RX_TRIG_LEVL 6

#define INT_REC_REST_DAT 6
#define INT_UART_ERR 3
#define INT_REC_DAT_AVAIL 2
#define INT_TRANREGEMPTY 1

#define RDR 0
#define OE 1
#define PE 2
#define FE 3
#define BI 4
#define THRE 5
#define TEMT 6
#define RXFE 7

char * Message = "Hallo UART, sag mal Piep! \r \n " ;

void baud_regset(int baudrate)
{
  U1LCR |= (1 << DLAB);   //DLAB = 1;

  int x = PCLK/(16*baudrate);
  U1DLM = x / 256;       
  U1DLL = x % 256;

  U1LCR |= (0 << DLAB);
}

void uart1_init(void)
{
  U1FCR = (1 << TX_FIFO_RESET) | (1 << RX_FIFO_RESET) | (1 << FIFO_ENABLE) | (0 << RX_TRIG_LEVL);  //Nach jedem Zeichen FIFO-RX-Interrup    // Enable and clear FIFO's
  U1LCR |= (1<<DLAB)| (1 << UART_WORD_LENGTH1) | (1 << UART_WORD_LENGTH0) | ( 1 << BREAK_CONTROL );       // 8N1 Datenformat, enable Divisor latch bit
  
  baud_regset(9600);
  install_irq( UART1 , (void*)UART1_handler );

  U1LCR =  (0<<DLAB) | (1 << UART_WORD_LENGTH1) | (1 << UART_WORD_LENGTH0);   // Disable Divisor latch bit
  U1IER = (1 << REC_INT_EN); //| (1 << TRAN_INT_EN);         //Enable Receive und !Transmit-Interrupt

  U1TER = (1 << TXEN);
  PCONP |= (1 << PCUART1 );   //PCONP Power Control for Peripherals Register

  PINSEL0 |= (1 << TXD_UART1) | (1 << RXD_UART1); 
}

void uart1_transmit_string(char* text)
{
  while( *text != 0 )
  {  
    while( !( U1LSR & THRE) );
    U1THR = *(text++);
    
  }
}

void main(void)
{
 uart1_transmit_string( Message ) ;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. C. schrieb:

Ich kenn zwar den Chip nicht, aber

>     while( !( U1LSR & THRE) );

bist du sicher, dass das so stimmt?
Ich hätte da eher

>     while( !( U1LSR & (1<<THRE)) );

erwartet

Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, ja so ist es natürlich falsch,
hatte es vorher so ähnlich wie du, ging aber nicht.
Mit deinem Code funktionerts, danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.