2016-10-19 3 views
1

Я работаю над проектом, который имеет последовательную связь между ПК с ОС Windows и картой Arduino Uno.C++ Последовательная связь с Arduino

В коде C++ У меня есть SerialClass.h и Serial.cpp

Моя проблема заключается в том, что я получаю ошибку компиляции: идентификатор "SP" не определено в функции

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

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

I знаю, если я определяю SP в этой функции, я избавлюсь от этой ошибки, но Я не хочу активировать последовательный порт в этой функции. Я хочу активировать последовательный порт в этой функции

bool Serial::OpenPtoArd() 

{ 

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

    bool status = true; 
} 
} 

и сохранять его активным до тех пор, пока мое приложение запущено.

Может ли кто-нибудь помочь мне здесь?

Вот 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); 


}; 

Вот 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); 
} 

} 

ответ

0

Проблема с этим кодом

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

является то, что вы создаете новый Serial - а затем потерять указатель на Serial при выходе из функции. Если вы хотите, чтобы другие функции имели доступ к нему, вам нужна переменная SP, которая должна быть снаружиOpenPtoArd() функция.

Вы можете (должны?) Либо сделать его членом вашего класса (который, кстати будет столкновение с Serial класса Arduino в - назовем это что-то другое!), Или сделать его глобальную переменную: поставить следующую строку в верхней части файла:

YourSerialClass *SP = NULL; 

Обратите внимание, что я установил переменную NULL. Ваш другой код должен знать, имеет ли SP порта был создан еще или нет - и не использовать его, если он не был:

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

Я добавил Последовательный * SP = NULL; к началу Serial.cpp. Так хорошо в Serail.cpp. – user1288615

+0

Я добавил Serial * SP = NULL в верхней части Serial.cpp. Теперь компиляция в порядке. Но когда я добавляю вызов функции Serial :: OpenPtoArd() с SP-> OpenPtoArd() из класса anoter, я получаю ту же ошибку компилятора, что и раньше. Этот другой код класса имеет #include «SerialClass», поэтому я также попытался установить Serial * SP = NULL; там, но все еще проблема – user1288615

+0

Я получил компиляцию Ok после установки добавления Serial * SP = NULL в начало кода для другого класса. Теперь вызовы функций работают, но как только функция OpenPtoArd выйдет из SP, снова будет NULL. Я вернулся к началу моих проблем. – user1288615

Смежные вопросы