Forum: Compiler & IDEs RS232 wird unterbrochen druch \n newline


von Simon (Gast)


Lesenswert?

Hallo,


Ich habe mein GPS empfaenger Navilock NL-501ETTL
an Atmega 32L (3,3V).

Ich verwene die Uart Library:
Title:    Interrupt UART library with receive/transmit circular buffers
Author:   Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
File:     $Id: uart.c,v 1.6.2.1 2007/07/01 11:14:38 peter Exp $


Da ich bisle Probleme hatte die Daten zu verarbeiten habe ich folgendes 
in
meinem Programm:

c = uart_getc();
uart_putc(c);

GPS(TX) geht an den Atmega32, von da sende ich das signal
an einen MAX3232 und dann zum PC.

Ist der GPS empfaenger direkt am PC, sind die ausgaben richtig.
Sobald ich die Daten aber ueber den Prozessor schicke, sehe ich immer
wieder \n New Line zeichen in der Ausgabe.

Woher kommen die? Kann das an der Library liegen?

Was mich wundert, es geht kein einziges zeichen vom GPS empfaenger 
verloren. nur die stoerenden \n sind drinne.

von Karl H. (kbuchegg)


Lesenswert?

Simon schrieb:
> Hallo,
>
>
> Ich habe mein GPS empfaenger Navilock NL-501ETTL
> an Atmega 32L (3,3V).
>
> Ich verwene die Uart Library:
> Title:    Interrupt UART library with receive/transmit circular buffers
> Author:   Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
> File:     $Id: uart.c,v 1.6.2.1 2007/07/01 11:14:38 peter Exp $

Die UART Library vom PeFl wartet nicht auf Zeichen ...

> c = uart_getc();
> uart_putc(c);

Du musst schon auch noch abfragen, ob an der uart überhaupt ein Zeichen 
reingekommen ist.
Schau dir die Demo an, die PeFl mit der Library mitliefert. Da siehst du 
wies gemacht wird.

von Simon (Gast)


Lesenswert?

Das mache ich davor mit:

if ( c & UART_NO_DATA )
        {
}

danach.


Aber mir ist was anderes aufgefallen, wenn ich das ganze abschalte.
und dann nur mein MAX3232 mit strom versorge und das Kabel heraus ziehe.
gibts ebenfalls ein \n.

Ich glaube das entsteht durch ein schwaches signal vom Prozessor.

von Karl H. (kbuchegg)


Lesenswert?

Simon schrieb:
> Das mache ich davor mit:
>
> if ( c & UART_NO_DATA )
>         {
> }
>
> danach.

Warum sagst du dann, du machst das so:

c = uart_getc();
uart_putc(c);

Wenn schon, dann muss das so aussehen
1
  unsigned int c;
2
3
  ...
4
  c = uart_getc();
5
  if( ( c & UART_NO_DATA ) == 0 )
6
    uart_putc( c );

>
> Aber mir ist was anderes aufgefallen, wenn ich das ganze abschalte.
> und dann nur mein MAX3232 mit strom versorge und das Kabel heraus ziehe.
> gibts ebenfalls ein \n.
>
> Ich glaube das entsteht durch ein schwaches signal vom Prozessor.

Ach und dieses fehlinterpretierte Signal ergibt ausgerechnet das 
Bitmuster von '\n'. Daran glaub ich nicht.

Zeig mal deinen kompletten Code

von Simon (Gast)


Lesenswert?

> Ach und dieses fehlinterpretierte Signal ergibt ausgerechnet das
> Bitmuster von '\n'. Daran glaub ich nicht.

Vorallem ausschliesslich \n und kein anderes wirres Zeichen, nicht ein 
einziges.


Auch beim init am anfang, sehe ich kein ungewolltes \n!

   uart_puts("$PSRF103,00,00,01,00*24\r\n"); //GGA einschalten ohne 
Checksum
   //_delay_ms(500);
   uart_puts("$PSRF103,05,00,01,00*21\r\n"); //VTG einschalten ohne 
Checksum
   //_delay_ms(500);
   uart_puts("$PSRF103,01,00,00,01*25\r\n"); //GLL abschalten
   //_delay_ms(500);
   uart_puts("$PSRF103,02,00,00,01*26\r\n"); //GSA abschalten
   //_delay_ms(500);
   uart_puts("$PSRF103,03,00,00,01*27\r\n"); //GSV abschalten
   //_delay_ms(500);
   uart_puts("$PSRF103,04,00,00,01*20\r\n"); //RMC abschalten
   //_delay_ms(500);
   uart_puts("$PSRF103,06,00,00,01*22\r\n"); //MSS abschalten
1
void getgps(void)
2
{
3
     c = uart_getc();
4
    if ( c & UART_NO_DATA )
5
        {
6
            
7
        }
8
        else
9
    {
10
11
    if (c != '\n') { uart_putc(c); }
12
13
}
Ich habe hier sogar nochmal \n rein gemacht das auch im falle das der 
prozessor vom GPS ein \n empfaengt, dieses nicht weiter gesendet wird.
Der rest vom code ist auskommentiert.

von Simon (Gast)


Lesenswert?

Ich habs mal umgeaendert auf

    if (c != 10) { uart_putc(c); }

selbes ergebnis.

Wenn ich aber:
    if (c != 10) { uart_putc('A'); }

mache, gibts kein einziges \n sondern nur A.

Also ich begreife es nicht

von Karl H. (kbuchegg)


Lesenswert?

Simon schrieb:

> Also ich begreife es nicht

Dieses uart_putc  muss ja logischerweise auf eine andere UART führen, 
als die, die von der Fleury Lib verwaltet wird.

Verdacht: in dieser uart_putc stimmt was nicht.


Wie, ganz genau sieht deine Verschaltung aus?


         UART             UART
  GPS   <------> Mega32 <------> PC

teilst du die TX/RX Leitung der einzige UART auf oder wie machst du das?

von Simon (Gast)


Lesenswert?

Ich habe die uart.c und uart.h mal umbenannt
uartp.h und uartp.c

wenn ich diese im include weg lasse, erkennt er die funktion uart_putc 
nicht mehr.


Das mit der verschaltung..

GPS-TX ----> uP-RX  --uP schickts weiter --> uP TX ---> MAX3232-In ----> 
Max3232 Out ---> PC


Ich hatte auch schonmal GPS TX ---> MAX3232 ---> PC funzte bestens

von Simon (Gast)


Lesenswert?

moooooment... ich habe
die uart dateien vom include entfernt, das compiled immernoch. jedoch 
mit zwei warnungen:

../gps.c:48: warning: implicit declaration of function 'uart_puts'

von Simon (Gast)


Lesenswert?

Problem geloest:

> Dieses uart_putc  muss ja logischerweise auf eine andere UART führen,
> als die, die von der Fleury Lib verwaltet wird.


ich habe die funtion uart_putc umbenannt. und nun auf einmal sind die \n 
verschwunden.

Allerdings frage ich mich welche funktion wird dann genommen?!

Hat einer dieser libs so eine funktion ?!

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
//#include <avr/interrupt.h>
#include <inttypes.h>
#include "uartp.h"


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.