2013-07-16 61 views
0

我想創建一個類,將讀取和解析從串行端口的數據,但我不斷收到一個實例化的錯誤,我不知道爲什麼。這個類需要一個串口和它的io_service。我正在使用boost。我遇到了很多錯誤,但我認爲它是因爲它的累積性(我認爲,我不確定這是否正確)。這裏是第一個:類從這裏實例化錯誤C++

在文件中包含從/usr/include/boost/bind.hpp:22:0, 從../Sources/Magnetic補償Core.cpp:17:

/usr/include/boost/bind/bind.hpp:在實例化'boost :: _ bi :: result_traits &,const boost :: system :: error_code &,unsigned int)>': /usr/include/boost/bind/bind_template.hpp:15:48:從'boost :: _ bi :: bind_t &,const boost :: system :: error_code &,unsigned int),boost :: _ bi :: list4,boost :: reference_wrapper>實例化, boost :: arg < 1>,噓聲噸:: ARG < 2>>>」

下面是類的代碼:

class mag_serial 
{ 
bool data_available; 
boost::asio::serial_port& ser_port; 
boost::asio::deadline_timer timeout; 
char my_buffer[1]; 
std::string str; 
std::string st; 


void read_callback(bool& data_available, boost::asio::deadline_timer& timeout, const boost::system::error_code& error, std::size_t bytes_transferred) 
     { 

      data_available = true; 
      if(str.length() > 1) 
      { 
      if (!(str.at(str.length() - 1) == temp))//&str.at(str.length() - 1) != "#") 
      { 
       str.append(my_buffer,bytes_transferred); 
       if(str.at(str.length() - 1) == quit) 
       { 
        cout << "I am quitting"; 

          Stop(); 
          ser_port.cancel(); 
          ser_port.close(); 
          return; 
       } 

       i++; 
      } 

      else if (str.at(str.length() - 1) == temp) 
      { 
       st = str;//.substr(1, str.size()); 

       // Processing Functions 
      } 
      } 
      else 
      { 
       str.append(my_buffer,bytes_transferred); 
       if(str.at(0) == quit) 
       { 
        cout << "I am quitting"; 
        Stop(); 
          ser_port.cancel(); 
          ser_port.close(); 
          return; 
       } 
      } 
      ser_port.async_read_some(boost::asio::buffer(my_buffer), 
       boost::bind(&mag_serial::read_callback, boost::ref(data_available), 
         boost::ref(timeout),boost::asio::placeholders::error(), 
         boost::asio::placeholders::bytes_transferred())); 
      data_available = true; 
     } 

     void wait_callback(boost::asio::serial_port& ser_port, const boost::system::error_code& error) 
     { 
      if (error) 
      { 
       // Data was read and this timeout was cancelled 

       return; 
      } 

     } 




public: 
mag_serial(boost::asio::serial_port& ser_port, boost::asio::io_service& io_svc): ser_port(ser_port), timeout(ser_port.get_io_service()){} 



void read_mag_serial_thread() 
{ 
    bool data_available = false; 

    ser_port.async_read_some(boost::asio::buffer(my_buffer), 
      boost::bind(&mag_serial::read_callback, boost::ref(data_available), 
        boost::ref(timeout),boost::asio::placeholders::error(), 
        boost::asio::placeholders::bytes_transferred())); 
    timeout.expires_from_now(boost::posix_time::seconds(1)); 
    timeout.async_wait(boost::bind(&mag_serial::wait_callback, boost::ref(ser_port),boost::asio::placeholders::error())); 

    io_svc.run(); 

    if(!data_available) 
    { 
     ser_port.close(); 
     cout << "ser_port was closed"; 
    } 
} 

}; 
+5

什麼是錯誤? – Borgleader

+0

它的一系列錯誤。第一個是:在/usr/include/boost/bind.hpp:22:0, 包含的文件中:../Sources/Magnetic Compensator Core.cpp:17: /usr/include/boost/bind/bind .hpp:在實例化'boost :: _ bi :: result_traits & ,const boost :: system :: error_code&,unsigned int)>': /usr/include/boost/bind/bind_template.hpp:15:48:從'boost :: _ bi :: bind_t user2554193

+0

boost :: asio :: basic_deadline_timer &,const boost :: system :: error_code&,unsigned int),boost :: _ bi :: list4 < boost :: reference_wrapper ,boost :: reference_wrapper >,boost :: arg <1>,boost :: arg <2>> >' – user2554193

回答

1

這不會編譯

ser_port.async_read_some(boost::asio::buffer(my_buffer), 
       boost::bind(&mag_serial::read_callback, boost::ref(data_available), 
         boost::ref(timeout),boost::asio::placeholders::error(), 
         boost::asio::placeholders::bytes_transferred())); 

成員函數mag_serial::read_callback需要一個實例綁定到。

ser_port.async_read_some(
    boost::asio::buffer(my_buffer), 
    boost::bind(
     &mag_serial::read_callback, 
     this, 
     boost::ref(data_available), 
     boost::ref(timeout), 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred 
    ) 
); 

這裏有一個coliru,我並沒有試圖修正格式。

+0

謝謝。我無法相信我忘記了最簡單的事情 – user2554193