我打算使用Boost Asio库来定位串口。但是,我并不完全确定如何使用它。
据我了解,asio需要构建。理论上有一个火腿构建...脚本? - 已经配置为在这种情况下使用。但是,我似乎没有构建.exe。显然它可以通过构建Boost.Build来获得。但是,运行该构建脚本也失败了。
我已经运行了bootstrap.bat,它未能引用它找不到“cl”。构建脚本是相同的。
我觉得答案很简单,但我不确定。我试过我在这里看到的答案,但那也失败了。
编辑:
据我所知,已成功建造。据我了解,asio是一个仅限标题的库,但系统不是。我的配置是用于多线程静态调试。我,使用了一些试验和错误,以及一个提升文档页面,找到了一个构建我的代码。但是,它会抛出异常,我不确定它是否是某种程度上的库不匹配或错误的构建 - 因为这是第一行代码依赖于它是否链接 - 或者我的代码是否只是坏的并且提升工作细
以下是代码:
//SimpleSerial.h
#include <boost/asio.hpp>
class SimpleSerial
{
public:
/**
* Constructor.
* \param port device name, example "/dev/ttyUSB0" or "COM4"
* \param baud_rate communication speed, example 9600 or 115200
* \throws boost::system::system_error if cannot open the
* serial device
*/
SimpleSerial(std::string port, unsigned int baud_rate)
: io(), serial(io,port)
{
serial.set_option(boost::asio::serial_port_base::baud_rate(baud_rate));
}
/**
* Write a string to the serial device.
* \param s string to write
* \throws boost::system::system_error on failure
*/
void writeString(std::string s)
{
boost::asio::write(serial,boost::asio::buffer(s.c_str(),s.size()));
}
/**
* Blocks until a line is received from the serial device.
* Eventual '\n' or '\r\n' characters at the end of the string are removed.
* \return a string containing the received line
* \throws boost::system::system_error on failure
*/
std::string readLine()
{
//Reading data char by char, code is optimized for simplicity, not speed
using namespace boost;
char c;
std::string result;
for(;;)
{
asio::read(serial,asio::buffer(&c,1));
switch(c)
{
case '\r':
break;
case '\n':
return result;
default:
result+=c;
}
}
}
private:
boost::asio::io_service io;
boost::asio::serial_port serial;
};
//end SimpleSerial.h
//main.cpp
#include <iostream>
#include "SimpleSerial.h"
using namespace std;
using namespace boost;
int main(int argc, char* argv[])
{
try {
SimpleSerial serial("COM1",115200);
serial.writeString("Hello world\n");
cout<<serial.readLine()<<endl;
} catch(boost::system::system_error& e)
{
cout<<"Error: "<<e.what()<<endl;
return 1;
}
}
//end main.cpp
SimpleSerial序列的异常抛出(“COM1”,115200);线。错误:
boost :: exception_detail :: clone_impl&gt;在内存位置0x006DF470。
答案 0 :(得分:4)
链接
请务必链接到boost_system(用于错误子系统)。另外,请确保运行时找到的.dll
与构建时使用的.lib
文件完全匹配。
登录
I suggest you add more exception detail:
#include <boost/exception/diagnostic_information.hpp>
// ....
} catch(boost::system::system_error& e)
{
cout<<"Error: " << e.what()<<endl;
cout<<"Info: " << boost::diagnostic_information(e) <<endl;
return 1;
}
这将(在Linux上)打印"COM1:"
:
Error: open: No such file or directory
Info: Throw location unknown (consider using BOOST_THROW_EXCEPTION)
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >
std::exception::what: open: No such file or directory
以root用户身份运行时,或者以"/dev/tty0"
的非root用户身份运行时:
Error: open: Permission denied
Info: Throw location unknown (consider using BOOST_THROW_EXCEPTION)
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >
std::exception::what: open: Permission denied
(当然,以root身份运行/dev/tty0
}时没有错误。
答案 1 :(得分:0)
您没有向我们提供太多信息,但由于cl
我认为您在Windows下运行。
首先,您需要在路径中使用编译器的shell。使用Visual Studio命令提示符。检查您是否可以在提示符处拨打cl
。
其次是build instruction。它应该像章节5.3.1
中所描述的那样简单。至少是在我尝试在Windows下构建boost时。