简体   繁体   中英

C++ Serial communication with Arduino

I am working on a project that has a serial communication between a Windows PC and an Arduino Uno card.

In the C++ code I have a SerialClass.h and a Serial.cpp

My problem is that I get a compiler fault: identifier "SP" undefined in the function

void Serial::SendtoArd(int val, int var)
{

if (SP->IsConnected())
{
    bool writeData = false;
    writeData = SP->WriteData("test",4);
}

I know if I define the SP in this function I get rid of this fault, but I do not want to activate the Serial port in that function . I want to activate the serial port in this function

bool Serial::OpenPtoArd()

{

Serial* SP = new Serial("\\\\.\\COM3");    // adjust as needed
if (SP->IsConnected())
{

    bool status = true;
}
}

and keep it active as long as my app is running.

Can anyone help me out here?

Here is the 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
~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();
bool OpenPtoArd();
void SendtoArd(int val, int var);


};

Here is the Serial.cpp

#endif // SERIALCLASS_H_INCLUDED


#include "stdafx.h"
#include "SerialClass.h"


#define LEN 1
bool status = false;
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;
}



void readme()

{

Serial serial("COM3");

char c[LEN + 1];
int numBytes = 0;
while (true)
{
    numBytes = serial.ReadData(c, LEN);
    if (numBytes != -1)
    {
        // Terminate the string if we want to use c variable as a string
        c[numBytes] = 0;
        break;
    }
}

}

bool Serial::OpenPtoArd()

{

Serial* SP = new Serial("\\\\.\\COM3");    // adjust as needed
if (SP->IsConnected())
{

    bool status = true;
}
}

void Serial::SendtoArd(int val, int var)
{

if (SP->IsConnected())
{
    bool writeData = false;
    writeData = SP->WriteData("test",4);
}

}

The problem with this code

bool Serial::OpenPtoArd()
{
    Serial* SP = new Serial("\\\\.\\COM3");    // adjust as needed
    if (SP->IsConnected())
    {
        bool status = true;
    }
}

is that you are creating the new Serial - and then losing the pointer to that Serial when the function exits. If you want other functions to be able to access it, you need the SP variable to be outside the OpenPtoArd() function.

You can (should?) either make it a member of your class (which by the way will clash with Arduino's Serial class - call it something else!), or make it a global variable: put the following line near the top of the file:

YourSerialClass *SP = NULL;

Note that I set the variable to NULL . Your other code needs to know whether the SP port has been created yet or not - and to not use it if it hasn't been:

if ((SP!=NULL) && (SP->IsConnected()) {
    ... do SP things
} // if

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM