00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 #if !defined(_SERIALPORT_T_H)
00016 #define _SERIALPORT_T_H
00017
00018 #include <iostream>
00019 #include <string>
00020 #include <typeinfo>
00021
00022 #include <boost/serialization/nvp.hpp>
00023 #include <boost/lexical_cast.hpp>
00024 #include <boost/serialization/split_member.hpp>
00025
00026
00027
00028 #include <boost/asio.hpp>
00029
00033 class SerialPort_t {
00034 public:
00035 typedef struct serialPortOptions_s {
00036 unsigned int baudRate;
00037 unsigned int charSize;
00038 boost::asio::serial_port_base::parity::type parity;
00039 boost::asio::serial_port_base::flow_control::type flowControl;
00040 boost::asio::serial_port_base::stop_bits::type stopBits;
00041
00043 serialPortOptions_s(): baudRate(9600), charSize(8),
00044 parity(boost::asio::serial_port_base::parity::none),
00045 flowControl(boost::asio::serial_port_base::flow_control::none),
00046 stopBits(boost::asio::serial_port_base::stop_bits::one) {};
00047 } serialPortOptions_t;
00048
00050 static SerialPort_t *Instance();
00051
00053 void open();
00054
00056 void close();
00057
00060 bool isOpen();
00061
00064 bool getLastConnState();
00065
00066
00069 void setPort(const std::string &port);
00070
00073 const std::string &getPort() const;
00074
00077 template <typename SettableSerialPortOption >
00078 void setOption(const SettableSerialPortOption &option);
00079
00082 template <typename GettableSerialPortOption >
00083 void getOption(GettableSerialPortOption &option);
00084
00087 const serialPortOptions_s &getOptions() const;
00088
00091 void write(const std::string &data);
00092
00096 std::string read(const int &num);
00097
00099 struct Break{};
00100
00101 private:
00102 static SerialPort_t *instanceHolder;
00103 SerialPort_t();
00104 ~SerialPort_t();
00105 void readState();
00106 void writeState();
00107
00109 friend class boost::serialization::access;
00110
00114 template<class Archive>
00115 void serialize(Archive & ar, const unsigned int version);
00116
00117 private:
00118 boost::asio::io_service io;
00119 boost::asio::serial_port port;
00120 std::string name;
00121 bool lastConnState;
00122
00126 serialPortOptions_t options;
00127 };
00128
00129 template <class T>
00130 SerialPort_t &operator<<(SerialPort_t &port, const std::string &s);
00131 template <class T>
00132 SerialPort_t & operator>>(SerialPort_t &port, std::string &s);
00133
00134
00135 template <typename SettableSerialPortOption >
00136 void SerialPort_t::setOption(const SettableSerialPortOption &option) {
00137 this->port.set_option( option );
00138
00139
00140
00141
00142 this->readState();
00143 }
00144
00145
00146 template <typename GettableSerialPortOption >
00147 void SerialPort_t::getOption( GettableSerialPortOption &option) {
00148 this->port.get_option( option );
00149 }
00150
00151
00152 template <class T>
00153 SerialPort_t &operator<<(SerialPort_t &port, const T &t) {
00154 port.write(boost::lexical_cast<std::string>(t));
00155 std::cout << boost::lexical_cast<std::string>(t);
00156 return port;
00157 }
00158
00159 template <>
00160 SerialPort_t &operator<<(SerialPort_t &port, const SerialPort_t::Break &t);
00161
00162 template <class T>
00163 SerialPort_t & operator>>(SerialPort_t &port, T &t) {
00164 t(port.read());
00165 return port;
00166 };
00167
00168
00169 template<class Archive>
00170 void SerialPort_t::serialize(Archive & ar, const unsigned int version)
00171 {
00172 using boost::serialization::make_nvp;
00173 using namespace::boost::asio;
00174
00175 ar & make_nvp("name", this->name);
00176
00177 ar & make_nvp("baudRate", this->options.baudRate);
00178 ar & make_nvp("charSize", this->options.charSize);
00179 ar & make_nvp("parity", this->options.parity);
00180 ar & make_nvp("flowControl", this->options.flowControl);
00181 ar & make_nvp("stopBits", this->options.stopBits);
00182
00183 ar & make_nvp("lastConnState", this->lastConnState);
00184 };
00185
00186 #endif //_SERIALPORT_T_H