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

Posted

技术标签:

【中文标题】Microsoft Visual C++ 2010 和 Arduino UNO 之间通过 USB 进行串行通信【英文标题】:Serial Comms between Microsoft Visual C++ 2010 and Arduino UNO via USB 【发布时间】:2015-09-03 20:38:34 【问题描述】:

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

我是机械工程专业的最后一年学生,对 Microsoft Visual Studios 和 C++ 的经验很少,所以请多多包涵,如果我的用语不正确,请见谅...

我在多个论坛上进行了广泛的研究,但找不到特定于我的问题的答案:

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

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

错误 C2065:“LcommPort”:未声明的标识符 错误 C2228:'.c_str' 的左侧必须有类/结构/联合

不幸的是,由于运动跟踪算法需要使用控制台应用程序类型的项目,我不能简单地将我的项目从“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 ) 

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

【问题讨论】:

这是唯一的错误吗?你在哪里包括string 您的问题标题对于所要求的实际问题非常具有误导性。请提供MCVE 来改进您的问题,而不是发布这么多不相关的代码。 【参考方案1】:

我收到以下错误:

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

【讨论】:

我直接使用了 commPort.c_str() 并且编译没有错误。不幸的是,我不知道 Unicode 或 ASCII 是什么意思……现在就要用谷歌搜索了。非常感谢您的宝贵意见! @TheCaptainFreestyle “很遗憾,我不知道 Unicode 或 ASCII 是什么意思..” 这是字符表示的问题(1、2 或更多字节字符)。

以上是关于Microsoft Visual C++ 2010 和 Arduino UNO 之间通过 USB 进行串行通信的主要内容,如果未能解决你的问题,请参考以下文章

基于 microsoft visual c++ express 2010 的 64 位构建

可以在 Microsoft 的 Visual C++ 2010 Express Edition 中安装 Whole Tomato 的 Visual Assist X 吗?

使用 Microsoft Visual C++ 2010 Express 时出现链接错误 LNK1123

使用 QWT 和 Microsoft Visual C++ 2010 绘制 MatLab 等效图

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

串口通信IN C++(适用于Microsoft Visual Studio 2010/2012/2013 ,VC++6.0 )