【发布时间】:2015-11-25 18:58:28
【问题描述】:
1.我们正在努力实现什么(以及为什么)
我们目前正在尝试通过 USB(COM)serial(RS232) 与工业机器人通信。我们想通过 C++ 应用程序控制机器人。
2。我们有什么设置
我们使用带有内置 C++ 编译器的 Visual Studio C++ 2015。创建“Win32 控制台应用程序”。
3.我们采取了哪些措施?
我们已经使用 Serial 在处理 (Java) 中建立了连接,但我们希望在 C++ 中实现它。
3.1 提升 ASIO
我们使用的是 Boost ASIO(安装了 NuGet 包管理器)。
此时,我们得到 2 个编译错误,指示相同的问题:
Error C2694 'const char *asio::detail::system_category::name(void) const': overriding virtual function has less restrictive exception specification than base class virtual member function 'const char *std::error_category::name(void) noexcept const'
我认为这个错误很可能不是由我的代码引起的(我没有更改库)。所以我认为VS21015 C++编译器与boost::asio不完全兼容?
我发现另外两个链接/帖子有一些相同的错误:
https://github.com/chriskohlhoff/asio/issues/35
我尝试了以下定义:
#ifndef ASIO_ERROR_CATEGORY_NOEXCEPT
#define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
#endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT)
Error in websocketpp library and boost in windows Visual Studio 2015
具有以下定义:
#define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
//or
#define ASIO_ERROR_CATEGORY_NOEXCEPT 1
但它并没有解决错误。甚至导致了很多随机语法错误和未声明的标识符(这表明缺少迭代器的包含。
3.2 Windows(基础)和 C
我们使用了一些 C 代码(并添加了一点 C++ 调试)来检测 COM 端口。但它根本不显示它们(但它在设备资源管理器中显示)。我们甚至不得不将 LPCWSTR 转换为 char 数组(wtf?)。
#include <stdio.h>
#include <cstdio>
#include <iostream>
#include <windows.h>
#include <winbase.h>
wchar_t *convertCharArrayToLPCWSTR(const char* charArray)
{
wchar_t* wString = new wchar_t[4096];
MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
return wString;
}
BOOL COM_exists(int port)
{
char buffer[7];
COMMCONFIG CommConfig;
DWORD size;
if (!(1 <= port && port <= 255))
{
return FALSE;
}
snprintf(buffer, sizeof buffer, "COM%d", port);
size = sizeof CommConfig;
// COM port exists if GetDefaultCommConfig returns TRUE
// or changes <size> to indicate COMMCONFIG buffer too small.
std::cout << "COM" << port << " | " << (GetDefaultCommConfig(convertCharArrayToLPCWSTR(buffer), &CommConfig, &size)
|| size > sizeof CommConfig) << std::endl;
return (GetDefaultCommConfig(convertCharArrayToLPCWSTR(buffer), &CommConfig, &size)
|| size > sizeof CommConfig);
}
int main()
{
int i;
for (i = 1; i < 256; ++i)
{
if (COM_exists(i))
{
printf("COM%d exists\n", i);
}
}
std::cin.get();
return 0;
}
3.3 来自互联网的另一个 Serial.h
相同的规则,我包含库,一切编译正常。 (测试写在下面)
#include <iostream>
#include <string>
#include "Serial.h"
int main(void)
{
CSerial serial;
if (serial.Open(8, 9600))
std::cout << "Port opened successfully" << std::endl;
else
std::cout << "Failed to open port!" << std::endl;
std::cin.get();
return 0;
}
但它仍然没有显示我的 COM 端口...(尽管它们确实显示在设备资源管理器中。)
4 那么实际上什么是有效的?
这段特定的代码将显示正确的 COM 端口...
TCHAR lpTargetPath[5000]; // buffer to store the path of the COMPORTS
DWORD test;
for (int i = 0; i<255; i++) // checking ports from COM0 to COM255
{
CString str;
str.Format(_T("%d"), i);
CString ComName = CString("COM") + CString(str); // converting to COM0, COM1, COM2
test = QueryDosDevice(ComName, lpTargetPath, 5000);
// Test the return value and error if any
if (test != 0) //QueryDosDevice returns zero if it didn't find an object
{
std::cout << "COM" << i << std::endl; // add to the ComboBox
}
}
【问题讨论】:
-
您需要一次提出 1 个问题。这至少是 3。您在
convertCharArrayToLPCWSTR中实现了内存泄漏。此外,转换是有意义的,因为char不是wchar_t。 -
关于constexpr提示:这确实很可能是因为VS2015开始支持constexpr,然后。要么你弄清楚如何配置它(其他编译器已经使用了很长时间),要么等待 Boost 1.60,migh 已经知道这个新的编译器版本。跨度>
-
你的端口真的是 COM8 还是只是一个例子?另请注意,您无法打开已打开的端口。检查您是否关闭了所有使用它的东西。另外,如果您不想转换为宽字符,可以使用
GetDefaultCommConfigA。 -
@sehe 所以 boost NuGet 包可能已经过时,与“新”编译器结合使用?我从互联网上得到了 convertCharArrayToLPCWSTR 函数,当时我没有得到 wchar_t 是什么。但它似乎定义了一个可能在高于(十进制)255 的范围内的 ASCII 字符?
标签: c++ boost serial-port