Senden und empfangen über serielle Schnittstelle

Gast #1335546
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.
Angehängte Dateien:
#1335583
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.
#1335590
Lesenswert?

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

Was het eigentlich das return 1; da mitten in der Schleife verloren
#1335652
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:
1
int PrintReceivedData (void)
2
{
3
  while( ( res = read( fd, buf, sizeof(buf) ) ) {
4
    buf[res] = '\0';
5
    printf( buf );
6
  }
7
}

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?)
Gast #1335685
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.
#1335710
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
1
int main()
2
{
3

4
   ...
5

6
   while( 1 )
7
   {
8
     frage Benutzer nach Kommando
9
     wenn Kommando == "Exit"
10
       exit
11

12
     SendeKommando
13
     WarteAufAntwort
14
   }
15
}
Gast #1335793
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

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