2011-07-27 125 views
3

我一直試圖通過它的串行端口和下面的C++代碼與Arduino進行通信。C++:與Arduino串行接口

唯一的是:它是總是返回invalid_handle_value。

我到處尋找,所有人都使用相同的代碼...除了它爲他們工作。

P.S:Arduino在COM15上。此代碼與端口COM4(藍牙)一起工作。

代碼

#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);*/ 

     GENERIC_READ | GENERIC_WRITE, 
     0, 
     0, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
     0); 

    //Check if the connection was successful. 
    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; 
} 

int main() { 
    Serial serial("COM15"); 
    if (serial.IsConnected()){ 
     serial.WriteData("1",1); 
     printf("\nData sent successfully!\n"); 
    } 
    system("pause"); 
    return 0; 
} 

回答