Serielle Schnittstelle auslesen

Gast #5463345
Lesenswert?

Hallo zusammen!
Ich bin will gerade auf meinem PC eine serielle Schnittstelle einlesen 
und in ein File abspeichern.
Ich hab meinen C-Code auch schon mehrere Male überprüft. Fine aber nicht 
meinen Fehler. Ist ganz komisch. Mein Arduino schickt dauerhaft den Text 
"test123" und ich kann auch über die Konsole die Werte lesen (nicht 
gleichzeitig natürlich mit meinem Programm)
Aber mein Textfile bleibt leer.

Hat jemand eine Ahnung was ich falsch mache?
1
#include <stdio.h>
2

3
int main(void)
4
{
5
  char buffer[256];
6

7
  FILE *pWriteToFile;
8
  FILE * pFile;
9
  pFile=fopen ("/dev/ttyACM0", "r");
10
  pWriteToFile=fopen ("zybo.txt", "a");
11

12
  if(pWriteToFile==NULL)
13
  {
14
    perror ("Error opening zybo.txt file.");
15
  }
16

17
  if (pFile==NULL) perror ("Error opening /dev/tty file");
18
  else
19
  {
20
    while(1)
21
    {
22

23
      while(!feof(pFile)) {
24
  if(fgets(buffer, sizeof(buffer), pFile) != NULL) {
25
    fprintf(pWriteToFile, "%s", buffer);
26
  }
27
      }
28
    }
29
    return 0;
30
  }
31
}
Gast #5463388
Lesenswert?

Vielleicht als kleine Ergänzung, ich vermute, dass die fgets-Funktion 
den Fehler hat. Weil wenn ich dort eine printf reinstecke, die nicht 
ausgegeben wird. Wenn ich diese vor das gets() setze, schon.
Aber mehrere Beispiele die ich gesehen habe, machen es genauso....
#5463389
Lesenswert?

Vorschlag: Ein fclose() am Ende kann Wunder bewirken.

Und meine Definition von fgets() sagt, dass ein String eingelesen wird. 
Kennzeichen eines String ist das '\n' am Ende. Wenn das nicht kommt, 
wartet fgets() bis zum Sankt Nimmerleins Tag und sammelt dabei fröhlich 
Zeichen, rückt sie aber nicht heraus.
#5463430
Lesenswert?

Georg G. schrieb:
> wennn das nicht kommt,
> wartet fgets() bis zum Sankt Nimmerleins Tag und sammelt dabei fröhlich
> Zeichen, rückt sie aber nicht heraus.

Nö.
Wenn der Buffer voll ist, (die Parameter von fgets), dann kehrt fgets 
zürück.
An dem fehlenden \n im buffer kann man dann erkennen, das die Zeile 
nicht vollständig gelesen wurde.

Versuch mal Zeichenweise. Statt der while (1)
1
int c;
2
while ((c = fgetc(pFile)) != EOF)  
3
  fputc ( c , pFile );
#5463431
Lesenswert?

derFragende schrieb:
> Kann es ein Problem der Baudrate sein?

Du hast geschrieben, dass du es mit einem Terminalprogramm richtig lesen 
kannst. Also stimmt die Baudrate. Es wäre aber dennoch guter Stil, am 
Anfang deines Programms die Baudrate explizit zu setzen.

Und noch ein Hinweis: Du gehst beim fprint() davon aus, dass im Buffer 
ein String ist, Nullterminiert, das ist aber nicht zwangsläufig so. Das 
Schreibergebniss kann also etwas seltsam werden.

Im Beitrag von 13:42 muss es natürlich "Zeile" und nicht "String" 
heissen.

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