Последовательная связь между Microsoft Visual C ++ 2010 и Arduino UNO через USB

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

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

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

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

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

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

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

Основная часть кода, который я использую, выглядит следующим образом (это упрощенный исходный файл теста, чтобы подтвердить, установлены ли связи между 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;
}

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

#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

Решение

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

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,

3

Другие решения


По вопросам рекламы [email protected]