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 )