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^F
Wie 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.