Forum: Mikrocontroller und Digitale Elektronik Uart sendet String nicht komplett


von A. C. (michael1988)


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:
1
#define UART1 7
2
#define TXEN 7
3
#define DLAB 7
4
#define UART_WORD_LENGTH0 0
5
#define UART_WORD_LENGTH1 1
6
#define BREAK_CONTROL 6
7
8
#define ENABLE_VIC_SLOT 5
9
#define TXD_UART1 16
10
#define RXD_UART1 18
11
#define TRANREGEMPTY 5        //Transmit Holding Register Empty
12
13
#define VICT_CNTL_NUM 0
14
15
#define REC_INT_EN 0
16
#define TRAN_INT_EN 1
17
18
#define TX_FIFO_RESET 2
19
#define RX_FIFO_RESET 1 
20
#define FIFO_ENABLE   0
21
#define RX_TRIG_LEVL 6
22
23
#define INT_REC_REST_DAT 6
24
#define INT_UART_ERR 3
25
#define INT_REC_DAT_AVAIL 2
26
#define INT_TRANREGEMPTY 1
27
28
#define RDR 0
29
#define OE 1
30
#define PE 2
31
#define FE 3
32
#define BI 4
33
#define THRE 5
34
#define TEMT 6
35
#define RXFE 7
36
37
char * Message = "Hallo UART, sag mal Piep! \r \n " ;
38
39
void baud_regset(int baudrate)
40
{
41
  U1LCR |= (1 << DLAB);   //DLAB = 1;
42
43
  int x = PCLK/(16*baudrate);
44
  U1DLM = x / 256;       
45
  U1DLL = x % 256;
46
47
  U1LCR |= (0 << DLAB);
48
}
49
50
void uart1_init(void)
51
{
52
  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
53
  U1LCR |= (1<<DLAB)| (1 << UART_WORD_LENGTH1) | (1 << UART_WORD_LENGTH0) | ( 1 << BREAK_CONTROL );       // 8N1 Datenformat, enable Divisor latch bit
54
  
55
  baud_regset(9600);
56
  install_irq( UART1 , (void*)UART1_handler );
57
58
  U1LCR =  (0<<DLAB) | (1 << UART_WORD_LENGTH1) | (1 << UART_WORD_LENGTH0);   // Disable Divisor latch bit
59
  U1IER = (1 << REC_INT_EN); //| (1 << TRAN_INT_EN);         //Enable Receive und !Transmit-Interrupt
60
61
  U1TER = (1 << TXEN);
62
  PCONP |= (1 << PCUART1 );   //PCONP Power Control for Peripherals Register
63
64
  PINSEL0 |= (1 << TXD_UART1) | (1 << RXD_UART1); 
65
}
66
67
void uart1_transmit_string(char* text)
68
{
69
  while( *text != 0 )
70
  {  
71
    while( !( U1LSR & THRE) );
72
    U1THR = *(text++);
73
    
74
  }
75
}

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

von Karl H. (kbuchegg)


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

von A. C. (michael1988)


Lesenswert?

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

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.