2016-10-19 109 views
1

私は、Windows PCとArduino Unoカードの間でシリアル通信を行っているプロジェクトに取り組んでいます。 C++コードでC++ Arduinoとのシリアル通信

私はSerialClass.hとSerial.cpp

を持っている私の問題は、私は、コンパイラの障害を得ることです:私は

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

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

機能では、識別子「SP」未定義 を私がこの機能で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); 


}; 

このコード

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

での問題は、あなたが新しいSerialを作成しているということである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

です関数が終了すると、そのポインタへのポインタが失われます。他の機能にアクセスできるようにするには、変数がの外にある必要があります。OpenPtoArd()の機能が必要です。

あなたはそれあなたのクラスのメンバにする(べきか)するか(ちなみにがアルドゥイーノのSerialクラスで衝突をなる - 何か他のものにそれを呼んで!)、またはそれをグローバル変数を作成します。put私はNULLに変数を設定し

YourSerialClass *SP = NULL; 

注:ファイルの先頭近くの行以下。あなたの他のコードはSPポートがまだか作成されているかどうかを知る必要がある - とにないそれがされていない場合、それを使用します。

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

を私はシリアル*のSP = NULLを追加しました。 Serial.cppの先頭に移動します。 Serail.cppでうまいです – user1288615

+0

Serial.cppの先頭にSerial * SP = NULLを追加しました。今コンパイルはOKです。しかし、関数serial :: OpenPtoArd()のコールをanoterクラスのSP-> OpenPtoArd()で追加すると、以前と同じコンパイラのエラーが発生します。この他のクラスコードには "SerialClass"が含まれているので、Serial * SP = NULLも入力してみました。しかし、まだ問題があります – user1288615

+0

シリアル* SP = NULLを他のクラスのコードの先頭に追加する設定をした後で、コンパイルしました。関数への呼び出しは機能しますが、すぐに関数OpenPtoArdが終了するとSPは再びNULLになります。だから私は自分の問題の始まりに戻る。 – user1288615

関連する問題