0

Мне нужно установить последовательную связь между Microsoft Windows Visual C++ 2010 и микроконтроллером Arduino через USB. Алгоритм отслеживания движения создает координаты X и Y, которые необходимо отправить в Arduino, который, в свою очередь, управляет двумя сервоприводами панорамирования и наклона.Последовательные связи между Microsoft Visual C++ 2010 и Arduino UNO через USB

Я последний год машиностроение и студентов имеют очень мало опыта работы с Microsoft Visual Studios и C++, поэтому, пожалуйста, медведь со мной и, пожалуйста, простите меня, если мои условия некорректны ...

Я сделал обширные исследования на нескольких форумах, но не может найти ответ, свойственный моей проблеме:

Все решения, с которыми я столкнулся, поддерживают только связь, когда в Visual Studios создается обычный/«пустой» проект. Пример можно найти здесь: Serial communication (for Arduino) using Visual Studio 2010 and C

При попытке и отладке одного и того же кода кода (который успешно выполняется в «пустом» проекте) в проекте «Консольное приложение Win32» мне представлены следующие ошибки:

C2065 ошибка: «LcommPort»: необъявленный идентификатор ошибка C2228: слева от «.c_str» должен иметь класс/структуры/объединения

к сожалению, я не могу просто изменить свой проект с „приложением Win32 Console“ к нормальный «пустой» проект из-за того, что алгоритм отслеживания движения требует использования типа приложения консоли.

Основная часть кода, который я использую, выглядит следующим образом (это упрощенный файл исходного кода проверки, чтобы подтвердить, установлены ли связи между MS Visual и Arduino, где частота, с которой светодиод включается и выключается, изменяется через последовательное соединение):

#include <Windows.h> 
    #include "ArduinoSerial.h" 
    #include "StdAfx.h" 

    int main() { 
     try { 
      ArduinoSerial arduino("COM3"); 

      Sleep(2000); // Initial wait to allow Arduino to boot after reset 

      char buffer[] = { 25, 100 }; 
      arduino.Write(buffer, 2); // Send on/off delays to Arduino (if return value is 0, something went wrong) 
     } 
     catch (const ArduinoSerialException &e) { 
      MessageBoxA(NULL, e.what(), "ERROR", MB_ICONERROR | MB_OK); 
     } 

     return 0; 
    } 

соответствующий исходный код, который является домом ошибки находится в line9 кода:

#include <algorithm> 
#include <sstream> 
#include <Windows.h> 
#include "stdafx.h" 

#include "ArduinoSerial.h" 

ArduinoSerial::ArduinoSerial(const std::string commPort) { 
    comm = CreateFile(TEXT(commPort.c_str()), 
         GENERIC_READ | GENERIC_WRITE, 
         0, 
         NULL, 
         OPEN_EXISTING, 
         0, 
         NULL); 

    if (comm == INVALID_HANDLE_VALUE) { 
     std::ostringstream error; 
     error << "Unable to acquire handle for " << commPort << ": "; 

     DWORD lastError = GetLastError(); 

     if (lastError == ERROR_FILE_NOT_FOUND) { 
      error << "Invalid port name"; 
     } 
     else { 
      error << "Error: " << lastError; 
     } 

     throw ArduinoSerialException(error.str()); 
    } 

    DCB dcb; 
    SecureZeroMemory(&dcb, sizeof DCB); 
    dcb.DCBlength = sizeof DCB; 
    dcb.BaudRate = CBR_9600; 
    dcb.ByteSize = 8; 
    dcb.StopBits = ONESTOPBIT; 
    dcb.Parity = NOPARITY; 
    dcb.fDtrControl = DTR_CONTROL_ENABLE; 

    if (!SetCommState(comm, &dcb)) { 
     CloseHandle(comm); 

     std::ostringstream error; 
     error << "Unable to set comm state: Error " << GetLastError(); 

     throw ArduinoSerialException(error.str()); 
    } 

    PurgeComm(comm, PURGE_RXCLEAR | PURGE_TXCLEAR); 
} 

std::size_t ArduinoSerial::Read(char buffer[], const std::size_t size) { 
    DWORD numBytesRead = 0; 
    BOOL success = ReadFile(comm, buffer, size, &numBytesRead, NULL); 

    if (success) { 
     return numBytesRead; 
    } 
    else { 
     return 0; 
    } 
} 

std::size_t ArduinoSerial::Write(char buffer[], const std::size_t size) { 
    DWORD numBytesWritten = 0; 
    BOOL success = WriteFile(comm, buffer, size, &numBytesWritten, NULL); 

    if (success) { 
     return numBytesWritten; 
    } 
    else { 
     return 0; 
    } 
} 

ArduinoSerial::~ArduinoSerial() { 
    CloseHandle(comm); 
} 

ArduinoSerialException::ArduinoSerialException(const std::string message) : 
    std::runtime_error(message) { 
} 

Любая помощь или совет будет очень высокую оценку.

+0

Это единственная ошибка? Где вы включаете 'string'? – deviantfan

+0

Ваше название вопроса очень вводит в заблуждение относительно фактической проблемы.Пожалуйста, предоставьте свой вопрос, предоставив [MCVE] (http://stackoverflow.com/help/mcve) вместо того, чтобы публиковать такой много нерелевантный код. –

ответ

3

Я представил следующие ошибки:

error C2065: 'LcommPort' : undeclared identifier error C2228: left of '.c_str' must have class/struct/union 

Этот маленький кусочек кода

TEXT(commPort.c_str()) 

становится фактически

LcommPort.c_str() 

Вот почему вы получите этот компилятор ошибка.

Вы должны заметить, что TEXT() является макросом препроцессора, предназначенным для символьных литералов, для префикса их L в зависимости от того, в каком режиме (Unicode/ASCII) скомпилирован ваш проект. Очевидно, что это не работает с любыми переменными.

Используйте либо commPort.c_str(), либо const std::wstring commPort.

+0

Я пошел вперед и использовал commPort.c_str() напрямую, и он скомпилировал ошибку. К сожалению, я понятия не имею, что означает Unicode или ASCII ... О том, что сейчас в Google. Большое вам спасибо за ценный вклад! – TheCaptainFreestyle

+0

@ TheCaptainFreestyle _ «К сожалению, я понятия не имею, что означает Unicode или ASCII ..» _ Это вопрос представления символов (1, 2 или более байтовых символов). –

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

  • Нет связанных вопросов^_^