1.io_server在run后会阻塞,因此要开辟线程进行操作。当然也可以用run_once来做同步串口操作。
void CSarialDlg::OnBnClickedOk()
{
// 这里的m_fun是成员变量
//boost::shared_ptr<boost::thread> m_fun;
m_fun = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&CSarialDlg::ThreadFun,this)));
}
2.线程中设置串口参数,开始读取
void CSarialDlg::ThreadFun()
{
try
{
m_sp = boost::shared_ptr<boost::asio::serial_port>(new boost::asio::serial_port(io, “com1”));
m_sp->set_option(boost::asio::serial_port::baud_rate(115200));
m_sp->set_option(boost::asio::serial_port::flow_control());
m_sp->set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none));
m_sp->set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one));
m_sp->set_option(boost::asio::serial_port::character_size(8));
boost::system::error_code err;
char buf[256]={0};
while (true)
{
m_sp->async_read_some(boost::asio::buffer(buf, 255),boost::bind(&CSarialDlg::handle_read,this,buf, _1, _2));
char szBuff[] = "write something";
int nLen = strlen(szBuff);
boost::asio::write(*m_sp.get(), boost::asio::buffer(szBuff,nLen));
io.run();
}
}
catch (std::exception& err)
{
//cout << "Exception Error: " << err.what() << endl;
}
}
void CSarialDlg::handle_read(char *buf,boost::system::error_code ec,std::size_t bytes_transferred)
{
if(!ec)
{
}
memset(buf,0,100);
m_sp->async_read_some(boost::asio::buffer(buf, 100), boost::bind(&CSarialDlg::handle_read,this,buf, _1, _2));
}
3.成员变量
boost::shared_ptr<boost::thread> m_fun;
bool m_isExitThread;
boost::asio::io_service io;
boost::shared_ptr<boost::asio::serial_port> m_sp;