Seriellen String mit C empfangen

Gast #3092849
Hallo zusammen!

Ich bin gerade dabei ein kleines Programm in C zu schreiben um einen 
String, der an der seriellen Schnittstelle ankommt zu empfangen. Der 
String ist maximal 160 Bytes lang. Das Öffnen des Ports und 
initialisieren funktioniert soweit, jedoch komme ich beim String nicht 
weiter.

Hier mal ein Ausschnitt, wie es bis jetzt läuft (allerdings werden hier 
nur einzelne Bytes empfangen):
1
void readdata(int iFd){
2
  char buf[160];
3
  int res=0;
4

5
  res = read(iFd,(char *)buf,160);
6
  
7
  printf("readfunction %d \n", res);
8

9
  if(res == -1) {
10
    printf("read was unsuccesfull\n");
11
    buf[0]='\0';
12
  }
13
  else {
14
    buf[res]='\0';
15
    printf("read succesfull\n",buf);
16
    printf("read:%s\n",buf);
17
  }
18
  printf("values read(printf):%s\n",buf);
19
}

Ich scheitere momentan am Zusammensetzen der einzelnen Bytes zu einem 
String. Vielleicht kann mir jemand an einem kleinen Beispiel das 
Vorgehen erklären; ich bin Anfänger in Sachen C.

Vielen Dank schonmal!

Grüsse, Mike
#3092929
Hallo Mike

Eigentlich gehören da noch ein paar Infos dazu. Du schreibst ja im 
PC-Forum, also gehe ich davon aus, dass Du ein PC-Programm schreibst. Um 
welches C handelt es sich denn?

1
#define BUFSIZE 160
2

3
void readdata(int iFd)
4
{
5
  char buf[BUFSIZE];
6
  char c;
7
  int  res;
8
  int  n = 0;
9

10
  do {
11
    res = read(iFd, (char *)&c, 1);  // Teste, ob ein Byte da ist
12
    
13
    if (res < 0) {                   // Falscher Fehler
14
      n = 0;                         // Anzahl Bytes zurücksetzen
15
      break;                         // abbrechen
16
    }
17

18
    if (res == 1 && c > '\0') {      // alternativ auf >= ' ' testen
19
      buf[n++] = c;                  // gültiges Byte in den Buffer
20
    }
21
  } 
22
  while (n< BUFSIZE-1 && c != '\0'); // Stringende erreicht
23
  buf[n] = '\0';                     // abschliessende Null anhängen
24

25
  if (res < 0) {
26
    printf("read was unsuccesfull\n");
27
  }
28
  else {
29
    printf("read succesfull\n");
30
    printf("read: %s\n", buf);
31
  }
32
  printf("bytes: %d\n", n);
33
}

Das Beispiel ist nicht getestet. Es hat keinen Timeout und bleibt in 
einer Endlosschleife, falls keine Daten mehr kommen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.