通过USB在Microsoft Visual C ++ 2010和Arduino UNO之间进行串行通信

时间:2015-09-03 20:38:35

标签: c++ visual-studio visual-studio-2010 arduino serial-communication

我需要通过USB在Microsoft Windows Visual C ++ 2010和Arduino微控制器之间建立串行通信。运动跟踪算法产生X和Y坐标,需要将其发送到Arduino,Arduino又控制两个摇摄和倾斜伺服。

我是机械工程专业的最后一年,对微软Visual Studio和C ++的经验很少,所以请耐心等待,如果我的条款不正确,请原谅我......

我在多个论坛上做了大量研究,但找不到特定于我的问题的答案:

在Visual Studio中创建普通/“空”项目时,我遇到的所有解决方案仅支持通信。可以在此处找到一个示例:Serial communication (for Arduino) using Visual Studio 2010 and C

当我尝试在“Win32控制台应用程序”项目中调试相同的代码体(在“空”项目中成功运行)时,出现以下错误:

错误C2065:'LcommPort':未声明的标识符 错误C2228:'。c_str'的左边必须有class / struct / union

不幸的是,我不能简单地将我的项目从“Win32控制台应用程序”更改为正常的“空”项目,因为运动跟踪算法需要使用控制台应用程序类型的项目。

我使用的主要代码如下(这是一个简化的测试源文件,用于确认是否在MS Visual和Arduino之间建立通信,其中LED打开和关闭的频率通过串行连接):

    #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 ) {
}

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分: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