mikrocontroller.net

Forum: Compiler & IDEs Senden und empfangen über serielle Schnittstelle


Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo Leute,

ich sende und empfangen Daten(String) über serielle Schnittstelle. Die 
Kommunikation ist zwischen einem Mikrocontroller und einem PC(linux) 
.Jedes empfangene String ist mit einem '\n' abgeschlossen. Mit dem 
aktuellen Programm kann ich nur ein String empfangen. Wenn ich ein 
Timeout einfüge, kann ich mehrere String nacheinander auslesen, aber ich 
muss das Programm in diesem Fall mit der Tastekombination strg+C 
abbrechen.
Wie kann ich dieses Problem lösen.
Anbei das Programm.

ich danke euch.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hallo Leute,
>
> ich sende und empfangen Daten(String) über serielle Schnittstelle. Die
> Kommunikation ist zwischen einem Mikrocontroller und einem PC(linux)
> .Jedes empfangene String ist mit einem '\n' abgeschlossen. Mit dem
> aktuellen Programm kann ich nur ein String empfangen. Wenn ich ein
> Timeout einfüge, kann ich mehrere String nacheinander auslesen, aber ich
> muss das Programm in diesem Fall mit der Tastekombination strg+C
> abbrechen.
> Wie kann ich dieses Problem lösen.

Du sagst doch selbst, dass 'jeder' String mit einem '\n' abgeschlossen 
ist.
Wie wäre es, wenn du darauf ganz einfach reagierst?
Sobald ein '\n' daherkommt ist der String fertig. Du verarbeitest ihn 
und schon kann der nächste String empfangen werden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int writeport(int fd, char *chars) {
  int len = strlen(chars);
  chars[len] = 0x0A; // stick a <LF> after the command
  chars[len+1] = 0x00; // terminate the string properly

Das nenne ich ... mutig

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int PrintReceivedData (void){
  
  while (STOP==FALSE) {  /* loop until we have a terminating condition */
         /* read blocks program execution until a line terminating character is 
    input, even if more than 255 chars are input. If the number
    of characters read is smaller than the number of chars available,
    subsequent reads will return the remaining chars. res will be set
    to the actual number of characters actually read */
    //printf("receive\n");
    res = read(fd,buf,255); 
    buf[res]='\0';             /* set end of string, so we can printf */
    printf("%s\n", buf, res);
    if (buf[0]=='\0') STOP=TRUE;
    return 1;

Was het eigentlich das return 1; da mitten in der Schleife verloren

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Karl,
bitte kannst Du explicit sein.
das return ist ein Fehler beim Kopieren.

Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit ist dein Problem ehrlich gesagt nicht wirklich klar.
Laut deinem Kommentar wartet read ja sowieso, bis eine Zeile vollständig 
ist

Als Grundschleife:
int PrintReceivedData (void)
{
  while( ( res = read( fd, buf, sizeof(buf) ) ) {
    buf[res] = '\0';
    printf( buf );
  }
}


Fragen an dich:
Belässt der read das \n im Datenstrom?
Woran erkennst du eigentlich, dass keine Daten mehr kommen? (Timeout, 
leere Zeile, spezielles Datenwort, oder was?)

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Karl,

ich möchte gern mit einer Timeout festgestellt, dass keine Daten kommen.
wie ich das int der Funktion int PrintReceivedData in Kommentiert.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo karl,

mit deiner Grunfschleife kann ich zwar mehrere String auslesen, aber ich 
muss
das Programm manuel abbrechen. Es geht nicht am Anfang des Programms 
zurück, damit ich das nächste Kommando sende.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hallo Karl,
>
> ich möchte gern mit einer Timeout festgestellt, dass keine Daten kommen.
> wie ich das int der Funktion int PrintReceivedData in Kommentiert.

Woran erkennt man einen Timeout? Was liefert read in so einem Fall 
zurück?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hallo karl,
>
> mit deiner Grunfschleife kann ich zwar mehrere String auslesen, aber ich
> muss
> das Programm manuel abbrechen. Es geht nicht am Anfang des Programms
> zurück, damit ich das nächste Kommando sende.

Dann wirst du das dann wohl in eine Schleife packen müssen
int main()
{

   ...

   while( 1 )
   {
     frage Benutzer nach Kommando
     wenn Kommando == "Exit"
       exit

     SendeKommando
     WarteAufAntwort
   }
}

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Karl,

ich bin nicht sicher aber ich denke, dass read in diesem Fall ein Null 
liefert. D.h res=0

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hallo Karl,
>
> ich bin nicht sicher aber ich denke, dass read in diesem Fall ein Null
> liefert. D.h res=0

Dann solltest du das erst mal abklären.
Testprogramm machen, in dem du dir den Returnwert von read ausgeben 
lässt. Und dann wartest du erst mal

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Karl,
wenn ich keine Daten Empfange, res wird nicht angezeigt(kein printf),

int PrintReceivedData (void)
{
  while ( res = read( fd, buf, sizeof(buf) ) ) {
    buf[res] = '\0';
    printf("%i\n",res);
    //if (buf[res]==0)
    if (res==0)
    {
      printf("res:%i\n",res);

    }
    printf( buf );

  }

}

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.