C++ Arduino Serial kommunikation

DreamGamer

Lieutenant
Registriert
Feb. 2017
Beiträge
543
Hallo, ich bin neu in der Sprache C++(ich habe zuletzt vor 6 Jahren mit C++ gearbeitet ^^) Ich wollte jetzt aber anfangen etwas mit Technik herumzuspielen habe mir deshalb einen Arduino Nano geholt. Und jetzt wollte ich über C++ etwas an die Arduino Serial senden und auch lesen. Dies habe ich mit diesem Skript aus dem Internet gemacht / versucht:

main.cpp
C++:
#include <stdio.h>

#include <tchar.h>

#include "SerialClass.h" // Library described above

#include <string>

// application reads from the specified serial port and reports the collected data

int _tmain(int argc, _TCHAR* argv[])

{

printf("Welcome to the serial test app!\n\n");

Serial* SP = new Serial("\\\\.\\COM6"); // adjust as needed

if (SP->IsConnected())

printf("We're connected\n\n");

char incomingData[256] = ""; // don't forget to pre-allocate memory

//printf("%s\n",incomingData);

int dataLength = 255;

int readResult = 0;

while (SP->IsConnected())

{

readResult = SP->ReadData(incomingData, dataLength);

// printf("Bytes read: (0 means no data available) %i\n",readResult);

incomingData[readResult] = 0;

if (SP->WriteData("Hallo", dataLength)) {

printf("Sended");

}

printf("%s", incomingData);

Sleep(500);

}

return 0;

}

Serial.cpp

C++:
#include "SerialClass.h"

Serial::Serial(const char *portName)

{

//We're not yet connected

this->connected = false;

//Try to connect to the given port throuh CreateFile

this->hSerial = CreateFile(portName,

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

//Check if the connection was successfull

if (this->hSerial == INVALID_HANDLE_VALUE)

{

//If not success full display an Error

if (GetLastError() == ERROR_FILE_NOT_FOUND) {

//Print Error if neccessary

printf("ERROR: Handle was not attached. Reason: %s not available.\n", portName);

}

else

{

printf("ERROR!!!");

}

}

else

{

//If connected we try to set the comm parameters

DCB dcbSerialParams = { 0 };

//Try to get the current

if (!GetCommState(this->hSerial, &dcbSerialParams))

{

//If impossible, show an error

printf("failed to get current serial parameters!");

}

else

{

//Define serial connection parameters for the arduino board

dcbSerialParams.BaudRate = CBR_9600;

dcbSerialParams.ByteSize = 8;

dcbSerialParams.StopBits = ONESTOPBIT;

dcbSerialParams.Parity = NOPARITY;

//Setting the DTR to Control_Enable ensures that the Arduino is properly

//reset upon establishing a connection

dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;

//Set the parameters and check for their proper application

if (!SetCommState(hSerial, &dcbSerialParams))

{

printf("ALERT: Could not set Serial Port parameters");

}

else

{

//If everything went fine we're connected

this->connected = true;

//Flush any remaining characters in the buffers

PurgeComm(this->hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR);

//We wait 2s as the arduino board will be reseting

Sleep(ARDUINO_WAIT_TIME);

}

}

}

}

Serial::~Serial()

{

//Check if we are connected before trying to disconnect

if (this->connected)

{

//We're no longer connected

this->connected = false;

//Close the serial handler

CloseHandle(this->hSerial);

}

}

int Serial::ReadData(char *buffer, unsigned int nbChar)

{

//Number of bytes we'll have read

DWORD bytesRead;

//Number of bytes we'll really ask to read

unsigned int toRead;

//Use the ClearCommError function to get status info on the Serial port

ClearCommError(this->hSerial, &this->errors, &this->status);

//Check if there is something to read

if (this->status.cbInQue>0)

{

//If there is we check if there is enough data to read the required number

//of characters, if not we'll read only the available characters to prevent

//locking of the application.

if (this->status.cbInQue>nbChar)

{

toRead = nbChar;

}

else

{

toRead = this->status.cbInQue;

}

//Try to read the require number of chars, and return the number of read bytes on success

if (ReadFile(this->hSerial, buffer, toRead, &bytesRead, NULL))

{

return bytesRead;

}

}

//If nothing has been read, or that an error was detected return 0

return 0;

}

bool Serial::WriteData(const char *buffer, unsigned int nbChar)

{

DWORD bytesSend;

//Try to write the buffer on the Serial port

if (!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))

{

//In case it don't work get comm error and return false

ClearCommError(this->hSerial, &this->errors, &this->status);

return false;

}

else

return true;

}

bool Serial::IsConnected()

{

//Simply return the connection status

return this->connected;

}

SerialClass.h

C++:
#ifndef SERIALCLASS_H_INCLUDED

#define SERIALCLASS_H_INCLUDED

#define ARDUINO_WAIT_TIME 2000

#include <windows.h>

#include <stdio.h>

#include <stdlib.h>

class Serial

{

private:

//Serial comm handler

HANDLE hSerial;

//Connection status

bool connected;

//Get various information about the connection

COMSTAT status;

//Keep track of last error

DWORD errors;

public:

//Initialize Serial communication with the given COM port

Serial(const char *portName);

//Close the connection

~Serial();

//Read data in a buffer, if nbChar is greater than the

//maximum number of bytes available, it will return only the

//bytes available. The function return -1 when nothing could

//be read, the number of bytes actually read.

int ReadData(char *buffer, unsigned int nbChar);

//Writes data from a buffer through the Serial connection

//return true on success.

bool WriteData(const char *buffer, unsigned int nbChar);

//Check if we are actually connected

bool IsConnected();

};

#endif // SERIALCLASS_H_INCLUDED



Komischerweise das Lesen funktioniert einwandfrei nur das Schreiben, da passiert einfach gar nichts es wird zwar gesendet angeblich, weil er halt, mit true zurückkommt. Nur wird mir ja in die Konsole geschrieben wenn etwas neues in die Serial geschrieben wird. Und es passiert ja nichts, nachdem ich etwas schreibe. Weiß einer weshalb? Ich habe auch noch andere Skripte probiert also von anderen Leuten und dort passiert auch nichts dort kommt senden erfolgreich, aber in der Konsole steht nie etwas neues. Freue mich sehr über Hilfe.

MFG DreamGamer
 
DreamGamer schrieb:
Und es passiert ja nichts, nachdem ich etwas schreibe. Weiß einer weshalb?
Und wie genau liest Du im Arduino den seriellen Port?
 
Öhhm man muss diesen dort auslesen ich dachte der serielle Port im Arduino ist zu vergleichen mit einer Konsole. Im Arudino steht aktuell nichts. Sollte dort etwas hinein um das zu empfangen oder?
 
Er soll eine LED Stripe ansteuern ^^ Um es genauer zu sagen wird ein Lied analysiert und daraus wird dann eine Farbe für den LED Stripe gemacht was dann zu dem Arduino geht. Und ok danke :D Wusste ich noch nicht ^^ Ich lese mich dort mal kurz ein ^^
 
Zurück
Oben