Forum: Mikrocontroller und Digitale Elektronik PIC / Printf über UART


von schnudl (Gast)


Lesenswert?

Mein erstes PIC Programm auf der selbstgestrickten dsPIC Platine:

Kann  mir jemand sagen, wieso das printf im folgenden (Test)Beispiel nur 
den string 123456 ausgibt und die 7 verschluckt?
Gemäss Librarryreferenz muss man eine Hilfsfunktion write bereitstellen, 
die vom printf (und anderen Funktionen aus stdio) aufgerufen wird.

Die Funktion wird für jedes Zeichen in printf aufgerufen mit length = 1.
Aber eben nicht für das letzte!

Bin ich nun blind, oder ist das ein Bug/Feature...?

1
#include <p30f4013.h>
2
#include <stdio.h>
3
4
void initUART2(int baudrate, int fcy);  
5
int write(int handle, void *buffer, unsigned int len);
6
7
int main(void)
8
{
9
  int i=0;
10
  
11
  char buffer[] = "1234567";
12
  
13
  i=9600;
14
  
15
  initUART2(i, 10); // CPUclk = 10MHz
16
  printf("%s", buffer);
17
  return 0;
18
}
19
20
void initUART2(int baudrate, int fcy)
21
{
22
  volatile UxMODEBITS *umode = &U2MODEbits;
23
  volatile UxSTABITS *ustatus = &U2STAbits;
24
  volatile unsigned int *brg = &U2BRG;  
25
  
26
  *brg = (unsigned int) (fcy*1.e6/(16.*baudrate)-1.);  
27
  
28
  umode->UARTEN = 1;
29
  umode->LPBACK = 0;
30
  umode->ALTIO = 0;
31
  umode->ABAUD = 0;
32
  umode->PDSEL = 0;
33
  umode->STSEL =0;
34
  
35
  ustatus->UTXISEL = 1;
36
  ustatus->UTXBRK = 0;
37
  ustatus->UTXEN = 1;
38
  return;
39
}  
40
41
42
int write(int handle, void *buffer, unsigned int len) 
43
{
44
int i;
45
volatile unsigned int c;
46
47
volatile UxSTABITS *ustatus = &U2STAbits;
48
volatile unsigned int *txreg = &U2TXREG;
49
50
for (i = 0; i<len; i++)
51
{
52
  while ((ustatus->TRMT) == 0);
53
  c = ((unsigned int *)buffer)[i]; 
54
  *txreg = c;
55
}
56
return(len);
57
}

von Analog (Gast)


Lesenswert?

mach doch mal <=len , also for (i = 0; i<=len; i++)

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.