1. 程式人生 > >Boost串列埠通訊第一課 boost::asio::serial_port基本使用

Boost串列埠通訊第一課 boost::asio::serial_port基本使用

boost庫有一個asio,支援串列埠通訊。
步驟:
  1、產生一個boost::asio::io_service(前攝模式,類似於完成埠,不過,可以針對不同IO物件)
  2、構造一個boost::asio::serial_port,有兩種方法:
      (一)boost::asio::serial_port m_serialPort(m_IoService, "COM1");
      (二)boost::asio::serial_port m_serialPort(m_IoService);
         m_serialPort.open("COM1"); 
注意這種方式開啟,如果串列埠沒有準備好,會導致程式拋異常,導致程式崩潰,所以應該要try{} catch包含,或者使用如下的方式
 boost::system::error_code ec;
 serial_port sp(iosev);
 m_serialPort.open("COM1", ec);
 if (ec) return;
或者
 try
 {
             boost::asio::serial_port m_serialPort(m_IoService);
         m_serialPort.open("COM1"); s
 }
 catch (exception& err)
 {
 }

  3、設定串列埠引數:波特率、奇偶校驗 位、停止位、字元大小和流量控制,通過set_option方法 
boost::asio::serial_port::baud_rate      波特率
boost::asio::serial_port::parity            奇偶校驗,可以為serial_port::parity::none / odd / even。
boost::asio::serial_port::flow_control      流量控制, 可以為serial_port::flow_control::type,enum型別,可以是none software hardware
boost::asio::serial_port::stop_bits          停止位,    可以為serial_port::stop_bits::one /onepointfive /two
boost::asio::serial_port::character_size   字元大小
  4、資料讀寫
    read_some
    write_some
      async_read_some
    async_write_some
      5、同步讀取例子

 io_service iosev;
 boost::system::error_code ec;
 serial_port sp(iosev);
 sp.open("COM1", ec);
 
 if (ec) return;
 sp.set_option(serial_port::baud_rate(9600));
 sp.set_option(serial_port::flow_control(serial_port::flow_control::none));
 sp.set_option(serial_port::parity(serial_port::parity::none));
 sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
 sp.set_option(serial_port::character_size(8));

 std::string strCompleteMsg;
 boost::asio::streambuf content_sb;
 int bytes = 0;

 while (1)
 {
  strCompleteMsg = "";
  bytes = 0;
  while (strCompleteMsg.find("\r\n") == std::string::npos)
  {
   bytes += boost::asio::read(sp, content_sb, boost::asio::transfer_exactly(1), ec);
   if (ec) break;

   boost::asio::streambuf::const_buffers_type cont_bufs = content_sb.data();
   strCompleteMsg = std::string(boost::asio::buffers_begin(cont_bufs), boost::asio::buffers_begin(cont_bufs) + bytes);
  }
 }