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 🙂


  • Mod

    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)?


  • Mod

    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?


  • Mod

    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.


Anmelden zum Antworten