Мне нужно установить последовательную связь между 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) {
}
Любая помощь или совет будет очень высокую оценку.
Это единственная ошибка? Где вы включаете 'string'? – deviantfan
Ваше название вопроса очень вводит в заблуждение относительно фактической проблемы.Пожалуйста, предоставьте свой вопрос, предоставив [MCVE] (http://stackoverflow.com/help/mcve) вместо того, чтобы публиковать такой много нерелевантный код. –