Trouble with Arduino Serial library for C++

I got the Serial class from http://www.arduino.cc/playground/Interfacing/CPPWindows
but my code isn’t working with it.

Can someone help me fix it? I’m having a lot of trouble:

#include "SerialClass.h"
#include <iostream>
using namespace std;

int main(){
    bool dummy;
    Serial mySerial("COM5");
    cout << mySerial.IsConnected();
    cin >> dummy;
    return 0;
}

I'm going to guess that you get a complaint about more than one 'main's.

Most people complain about code not working only after it compiles..

Are you trying to compile this code for the Arduino or for the PC (using Visual Studio)? It's PC code, not Arduino code.

I want to communicate with my Arduino, I'm programming in Dev-C++ so there's no SerialPort object like in Visual C++.

I keep getting the errors:

[Linker error] undefined reference to 'Serial::Serial(char*) [Linker error] undefined reference to 'Serial::IsConnected() [Linker error] undefined reference to 'Serial::~Serial()

It would have been useful if you had identified the errors in the first post. These messages are saying that you are not including the library that contains the SerialClass in the libraries to be linked with. If you provide more details, we might be able to help you figure out how to do this.

Okay thanks, here we go:

main.cpp:

#include "SerialClass.h"
#include <iostream>
using namespace std;

int main(){
    Serial mySerial("COM5");
    cout << mySerial.IsConnected();
    return 0;
}

SerialClass.h

#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(char *portName);
        //Close the connection
        //NOTA: for some reason you can't connect again before exiting
        //the program and running it again
        ~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(char *buffer, unsigned int nbChar);
        //Check if we are actually connected
        bool IsConnected();


};

#endif // SERIALCLASS_H_INCLUDED

SerialClass.cpp:

#include "SerialClass.h"

Serial::Serial(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;

             //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;
                 //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) && bytesRead != 0)
        {
            return bytesRead;
        }

    }

    //If nothing has been read, or that an error was detected return -1
    return -1;

}


bool Serial::WriteData(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;
}

And here are the errors:
[Linker error] undefined reference to 'Serial::Serial(char*)
[Linker error] undefined reference to 'Serial::IsConnected()
[Linker error] undefined reference to 'Serial::~Serial()

Thanks a ton! The link I posted has the libraries, but I’m sure posting them here is a lot easier for you guys to read.

What OS are you on? Why are you using Dev-C++? What is Dev-C++?

Did Serial.cpp get compiled?

It looks like you need to compile and link Serial.cpp to create a Serial.o file, then add that .o file to the link path for the main application.

Or add Serial.cpp to the project, so it gets compile/linked automagically.