ARM: Doppeltes Verschicken von Bytes mit UART

OP #1206081
Lesenswert?

Hallo zusammen!


Ich habe ein Problem beim Senden mit UART0. Im Durchschnitt wird jedes 
500. Byte fälschlicherweise doppelt verschickt, wobei der Fehler 
unregelmäßig auftritt. Bin mir jetzt nicht sicher ob es am Code(wobei 
man da wohl nicht sooo viel falsch machen kann) oder an der Hardware 
liegt. Ich hab von Olimex ein LPC-H2103 Board.
Die Uart Einstellungen muessten passen. Aber auch wenn nicht werden 
Bytes eher wohl gar nicht verschickt anstatt doppelt.
Für weitere Anregungen für die Fehlerursache wäre ich Euch sehr dankbar.


An die Funktion uart_sendPose wird ein float Array mit 6 Werten 
übergeben.
1
void uart_sendPose(float *fPose)
2
{
3
  int8_t j,i;
4
  
5
    
6
  for(j = 0; j < 6; j++)
7
  {
8
    for(i = 3; i >= 0; i--)
9
    {  
10
      uart_putc(*(((char *)fPose)+j*4+i));
11
    }
12
  }
13
         uart_putc(13);
14
  uart_putc(10);
15
}
16

17
void uart_putc(uint8_t c)
18
{
19
  while (!(U0LSR & (1 << 5)))
20
  continue;
21
  U0THR = c;  
22
  
23
}

Gruß Robert
Gast #1208444
Lesenswert?

Wie stellst Du fest, dass jedes x. Byte doppelt versendet wird?

Falls es ein PC mit einem USB-to-Serial Wandler ist, würde ich erstmal 
diesen Wandler als Fehlermöglichkeit mit einbeziehen. Man könnte im 
Device-Manager einiges an den Puffergrößen drehen oder aber einen 
anderen Chipsatz austesten.
OP #1215120
Lesenswert?

an einem Wandler kann das problem auch nicht liegen. Wenn ich in meinem 
Programm an der Stelle wo sonst geschickt wird, ein definiertes Array 
verschick, kommt das "Doppeltschicken" nicht vor.

Kann es sein, dass der µC bei dieser Programmzeile beim casten oder beim 
Adressensprung ab und zu nen Fehler macht?
1
uart_putc(*(((char *)fPose)+j*4+i));

Gruß Robert
OP #1215244
Lesenswert?

mein array hat 6 floats, ein float hat 4 bytes. geschickt wird 
byte-weise deswegen cast ich auf char. die innere schleife läuft von 3 
bis 0 also verkehrtrum wegen der Big Endian codierung.

Das schicken funktioniert ja im prinzip, nur eben öfers fehlerhaft weil 
bytes doppeltgeschickt werden. Für meine anwendung is der fehler aber zu 
hoch, da ich dann immer neu synchronisieren muss.


Hab nun mal ein neues Projekt angelegt. dabei verschick ich jedes ma 256 
bytes.
1
while (1)
2
  {
3
        for(i=0;i<256;i++)
4
          uart_putc(i);
5
  }

Dort verschickt er IMMER die 19(hex) doppelt. Baudrate hab ich scho 
verkleinert, bringt nix...

Ich verzweifel langsam.

Gruß Robert
Gast #1215254
Lesenswert?

Moment mal, Du meinst, der folgende_ Code schickt das Byte 0x19 _immer 
doppelt? Sowas habe ich ja noch nie gehört.
1
while (1)
2
  {
3
        for(i=0;i<256;i++)
4
          uart_putc(i);
5
  }

Schicke mal den kompletten kompilierbaren Code von dem Beispiel das ich 
jetzt hier auch zitiert habe.

Was benutzt Du für ein Terminalprogramm? Welche Terminalemulation? 
Welches OS? Irgendwelche USB-Serial-Wandler dazwischen?
OP #1215991
Lesenswert?

Ich benutze Hyperterminal. Emulation hab ich mit automatischer erkennung 
und ansi probiert.
wenn ich nur
1
while (1)
2
  {
3
      uart_putc(0x19);
4
      uart_putc(0xA5);
5
  }
verschick, dann wird die 19 nicht doppelt verschickt. verschick ich ne 
liste von uart_putc(0) - uart_putc(128) dann wird die 19 doppelt 
verschickt. es ist auch definitiv nicht das 19(hex) byte was doppelt 
verschickt wird sondern der wert 0x19.
Zudem teste ich immer mit hypertermial auf nem pc und mit einem Laptop.

Und nein es ist kein Aprilscherz :-)


Gruß Robert
Gast #1216064
Lesenswert?

So ist das mit dem Hyperterminal nun. Ich habe es schon mehrmals 
versucht, andere auch schon, aber ab und zu läuft es einfach nicht und 
keiner weiss warum. Versuch mal putty oder, wenn vorhanden, verbinde 
beide UARTS und bau dir ein loopback und zähl die Zeichen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren