Lese Serielleschnittstelle
- 
					
					
					
					
 Hallo Community, ich fange gerade mit C++ an und habe ein vermutlich typisches Anfängerproblem. Ich habe folgenden Code: #include <iostream> #include <cstdio> #include "ArduinoCom.h" using namespace THOMAS; char const* cSerialPortFilename = "test.txt"; //Konstruktor ArduinoCom::ArduinoCom() { } //"Main" Funktion der ArduinoCom Klasse. Sollte von anderen Klassen aufgerufen werden void ArduinoCom::Run() { WriteToUSB(); } //Schreibt in den USB Port void ArduinoCom::WriteToUSB(){ //Öffnet den Stream zum Device FILE* SerialPort = fopen(cSerialPortFilename, "w"); //Initalisiert den Buffer char cWriteBuffer[] = {'1'}; //Schreibt in den Buffer fwrite(cWriteBuffer, sizeof(char), sizeof(cWriteBuffer), SerialPort); //Verbindung schließen fclose(SerialPort); }Leider weiß ich nicht wie man dieses beheben kann. Eine Erklärung, warum dieser Fehler auftritt wäre sehr nett  
 
- 
					
					
					
					
 Vollständiges Minimalbeispiel und vollständige Fehlerbeschreibung. Warum mischt du C und C++? Das geht selten gut und sorgt oft für Fehler. Hast du mal den Rückgabewert von fopen geprüft? 
 
- 
					
					
					
					
 Ok dieses Problem hat sich erledigt, allerdings besteht jetzt ein neues: Ich würde gerne einen Stream (Schnittstelle vom Arduino). Zum testen habe ich eine Datei mit _handle = open("test.txt", O_RDWR | O_NOCTTY | O_NDELAY);geöffnet. void ArduinoCom::Recieve(){ int bytes; char buffer[10]; bytes = read (_handle, buffer, sizeof(buffer)); //Gibt 3 aus, was richtig ist, da 3 Bytes in der Datei stehen std::cout << bytes; //Gibt nichts aus std::string text = buffer; std::cout << text; }Diesen Code verwende ich zum auslesen der Schnittstelle/Datei. 
 Leider gibt er nichts aus (siehe Kommentare). Was er allerdings ausgibt ist, dass sich in der Datei 3 Bytes befinden, was auch richtig ist:Inhalt der Datei: ^@^D^FWie bekomme ich daraus wieder 3 Ints (Es sind 0,4,6)? 
 
- 
					
					
					
					
 Es wurde schon was ausgegeben, nämlich die drei Zeichen mit den Nummern 0, 4 und 6. Das sind irgendwelche unsichtbaren Steuerzeichen, darum siehst du nichts. string ist eben primär für Text da. char ebenfalls. Es bietet sich folgendes an: ssize_t bytes; // Korrekten Typ benutzen unsigned char buffer[10]; // Oder signed, je nachdem, was gewünscht ist bytes = read (_handle, buffer, sizeof(buffer)); for(ssize_t i = 0; i < bytes; ++i) cout << (int) buffer[i];
 
- 
					
					
					
					
 Supi das klappt jetzt einwandfrei  Ich habe das Array jetzt als char Array zurückgegeben: Die Recieve Funktion returned jetzt die Adresse zum dataArray Wie bekomme das returnte Array jetzt in das data Array. Ich habe es so probiert, allerdings BYTE data[10] = {}; memcpy(data, Recieve(false), 10);Aber das muss doch besser gehen: Irgendwie so: BYTE daten[10] = Recieve(false);Aber so klappt es ja nicht, wie macht man dies am besten? 
 
- 
					
					
					
					
 Warum schreibst du nicht gleich in das richtige Array? Was für eine Art Objekt ist das überhaupt? Ein rohes Array? Benutz doch C++-Sprachmittel, wie std::array oder std::vector! Dann hast du nicht die C-typische Sonderbehandlung für Arrays, mit der du anscheinend nicht zurecht kommst. Und Referenzen können auch nützlich sein. Vielleicht wäre std::string auch was für dich, so lange du die Daten ohnehin wie Zeichenketten behandelst. Überhaupt würde sich das ganze Lesen erheblich vereinfachen. Du nutzt derzeit ja die C-Funktionen für Dateien. Nimm doch die C++-Mittel! PS: Receive schreibt man nicht so, wie du denkst. 
 
