www.mikrocontroller.net

Forum: PC-Programmierung Serielle Kommunikation (USART) mit libSerial (c++) unvollständig


Autor: gunknown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes problem. Wenn ich die zahlen 0-255 von meinem 
mikrokontroller über USART an den PC sende und dort über die libSerial 
empfange kommen diese nicht vollständig an.
Es fehlen immer die Zahlen 9-13 und die 32 (dezimal). Dieses Verhalten 
habe ich auf zwei unterschiedlichen Rechnern eindeutig reproduzieren 
können.

Wenn ich gtkTerm (ein serielles Terminal) zum empfangen der Daten 
verwende erscheinen alle Zahlen. Das problem muß also die libSerial 
sein.

Kann jemand dieses Problem bestätigen beziehungsweise dem widersprechen?

Ich benutze die libserial-dev 0.5.2-0ubuntu1

Der entsprechende code vom uc:
unsigned char grr=0;
                        for(int i=0; i<256; ++i)
                        {
                                USART_Transmit(grr++);
                        }

Und der client für den PC:
    SerialStream serialstream;

    serialstream.Open("/dev/ttyUSB0");
    //setze parameter (8N1)
    serialstream.SetBaudRate(SerialStreamBuf::BAUD_115200);

    serialstream.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
    serialstream.SetNumOfStopBits(1);
    serialstream.SetParity(SerialStreamBuf::PARITY_NONE);
    serialstream.SetFlowControl(SerialStreamBuf::FLOW_CONTROL_NONE);


   unsigned char test;
   for(int i=0; i<256; ++i)
   {
       serialstream >> test;
       cout << test << endl;
   }

Probleme mit der Baudrate sind auzuschließen, da sonstige kommunikation 
eigentlich einwandfrei funktioniert.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ändere doch mal dazu:
   cout << int(test) << endl;

Kommt dann was an?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder noch dummer gefragt:
glaubst du im Ernst, eine Ausgabe sehen zu können, wenn du ein
Leerzeichen (32) ausgibst, oder horizontal tabulator (9) u.s.w.?

Autor: gunknown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, der fehler ist durch unaufmerksamkeit beim erstellen meines 
postings entstanden. Natürlich gebe ich den wert von test als integer 
aus (printf("%d\n", test);).

Die ausgabe sieht dann übrigens so aus:

0
1
2
3
4
5
6
7
8
14
15
16
.
.
.

Tritt bei euch auch dieses problem auf?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem, mit einem winzigen Quelltextfragment Fragen zu
stellen, und dann ist es noch das falsche, tritt bei mir
nicht auf, nein.

Autor: gunknown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal vollständige source codes, wobei das auf dem uc (ich verwende 
einen atmega8) evtl. unterschiedlich sein kann:

uc:
#include <avr/io.h>

//set desired baud rate
#define BAUDRATE 115200UL

//calculate UBRR value
#define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1)

void USART_Init()
{

   //Set Baud rate
 UBRRL=UBRRVAL; //low byte
 UBRRH=(UBRRVAL>>8); //high byte

 UCSRC=(1<<URSEL)|(3<<UCSZ0);


 //Enable The receiver and transmitter
 UCSRB=(1<<RXEN)|(1<<TXEN);
}

void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) )
       ;
  /* Put data into buffer, sends the data */
  UDR = data;
}

int main(void)
{
    USART_Init();
    DDRC = 0b00111101;
    PORTC = 0b11000010;

    unsigned char grr=0;
    for(int i=0; i<256; ++i)
    {
        USART_Transmit(grr++);
    }

}

client auf dem PC:
#include <SerialStream.h>
#include <iostream>

using namespace LibSerial;

int main( int argc, char** argv )
{
    SerialStream serialstream;

    serialstream.Open("/dev/ttyUSB0");
    //setze parameter (8N1)
    serialstream.SetBaudRate(SerialStreamBuf::BAUD_115200);

    serialstream.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
    serialstream.SetNumOfStopBits(1);
    serialstream.SetParity(SerialStreamBuf::PARITY_NONE);
    serialstream.SetFlowControl(SerialStreamBuf::FLOW_CONTROL_NONE);

unsigned char test;
   for(int i=0; i<256; ++i)
   {
       serialstream >> test;
       printf("%d\n", test);
   }
}

Und falls es sich tatsächlich um einen tiefgreifenden bug in der 
libserial handelt, kennt jemand gute alternativen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist m.E. nicht serialStream, sondern das Lesen daraus:
       serialstream >> test;

Standardmäßig wird der Operator >> auf einem istream jeglichen white 
space verwerfen.

Das kann für jeden Stream auch anders eingestellt werden.
Probier doch mal vor der Schleife:
  serialstream >> std::noskipws;

Autor: gunknown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tatsächlich, serialstream >> std::noskipws; bringt die lösung. Nun 
werden alle zahlen korrekt empfangen.
Ist mir zwar nicht verständlich warum, aber danke in jedem fall, da wäre 
ich nie drauf gekommen.

Autor: gunknown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist natürlich doch klar. Man braucht sich in der ascii tabelle ja nur 
mal die zeichen für die entsprechenden zahlen ansehen. Das sind eben 
gerade white spaces.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daß ein istream-operator>> per Voreinstellung alle white space
verwirft, ist z.B. bei Stroustrup oder dem Buch über die
C++-Standardbibliothek von Nicolai Josuttis erwähnt.
Daß man nicht alles parat hat, was da so erwähnt wird, steht auf
einem anderen Blatt...

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.