|
serial
1.0
Cross-platformserialportlibraryforC++
|
00001 00036 #ifndef SERIAL_H 00037 #define SERIAL_H 00038 00039 #include <limits> 00040 #include <vector> 00041 #include <string.h> 00042 #include <sstream> 00043 #include <exception> 00044 #include <stdexcept> 00045 00046 #define THROW(exceptionClass, message) throw exceptionClass(__FILE__, __LINE__, (message) ) 00047 00048 namespace serial { 00049 00053 typedef enum { 00054 fivebits = 5, 00055 sixbits = 6, 00056 sevenbits = 7, 00057 eightbits = 8 00058 } bytesize_t; 00059 00063 typedef enum { 00064 parity_none = 0, 00065 parity_odd = 1, 00066 parity_even = 2 00067 } parity_t; 00068 00072 typedef enum { 00073 stopbits_one = 1, 00074 stopbits_one_point_five, 00075 stopbits_two = 2 00076 } stopbits_t; 00077 00081 typedef enum { 00082 flowcontrol_none = 0, 00083 flowcontrol_software 00084 } flowcontrol_t; 00085 00089 class Serial { 00090 public: 00127 Serial (const std::string &port = "", 00128 unsigned long baudrate = 9600, 00129 long timeout = 0, 00130 bytesize_t bytesize = eightbits, 00131 parity_t parity = parity_none, 00132 stopbits_t stopbits = stopbits_one, 00133 flowcontrol_t flowcontrol = flowcontrol_none); 00134 00136 virtual ~Serial (); 00137 00151 void 00152 open (); 00153 00158 bool 00159 isOpen () const; 00160 00162 void 00163 close (); 00164 00166 size_t 00167 available(); 00168 00179 size_t 00180 read (unsigned char *buffer, size_t size); 00181 size_t 00182 read (std::vector<unsigned char> &buffer, size_t size = 1); 00183 size_t 00184 read (std::string &buffer, size_t size = 1); 00185 std::string 00186 read (size_t size = 1); 00187 00197 size_t 00198 readline (std::string &buffer, 00199 size_t size = 65536, 00200 std::string eol = "\n"); 00201 std::string 00202 readline (size_t size = 65536, 00203 std::string eol = "\n"); 00204 00216 std::vector<std::string> 00217 readlines (size_t size = 65536, std::string eol = "\n"); 00218 00227 size_t 00228 write (const unsigned char *data, size_t size); 00229 size_t 00230 write (const std::vector<unsigned char> &data); 00231 size_t 00232 write (const std::string &data); 00233 00242 void 00243 setPort (const std::string &port); 00244 00251 std::string 00252 getPort () const; 00253 00264 void 00265 setTimeout (long timeout); 00266 00271 long 00272 getTimeout () const; 00273 00286 void 00287 setBaudrate (unsigned long baudrate); 00288 00297 unsigned long 00298 getBaudrate () const; 00299 00308 void 00309 setBytesize (bytesize_t bytesize); 00310 00317 bytesize_t 00318 getBytesize () const; 00319 00327 void 00328 setParity (parity_t parity); 00329 00336 parity_t 00337 getParity () const; 00338 00346 void 00347 setStopbits (stopbits_t stopbits); 00348 00355 stopbits_t 00356 getStopbits () const; 00357 00366 void 00367 setFlowcontrol (flowcontrol_t flowcontrol); 00368 00375 flowcontrol_t 00376 getFlowcontrol () const; 00377 00379 void 00380 flush (); 00381 00383 void 00384 flushInput (); 00385 00387 void 00388 flushOutput (); 00389 00390 void 00391 sendBreak (int duration); 00392 00393 void 00394 setBreak (bool level = true); 00395 00396 void 00397 setRTS (bool level = true); 00398 00399 void 00400 setDTR (bool level = true); 00401 00402 bool 00403 getCTS (); 00404 00405 bool 00406 getDSR (); 00407 00408 bool 00409 getRI (); 00410 00411 bool 00412 getCD (); 00413 00414 private: 00415 // Disable copy constructors 00416 Serial(const Serial&); 00417 void operator=(const Serial&); 00418 const Serial& operator=(Serial); 00419 00420 std::string read_cache_; 00421 00422 // Pimpl idiom, d_pointer 00423 class SerialImpl; 00424 SerialImpl *pimpl_; 00425 00426 // Scoped Lock Classes 00427 class ScopedReadLock; 00428 class ScopedWriteLock; 00429 00430 // Read common function 00431 size_t 00432 read_ (unsigned char *buffer, size_t size); 00433 00434 }; 00435 00436 class SerialExecption : public std::exception 00437 { 00438 const char* e_what_; 00439 public: 00440 SerialExecption (const char *description) : e_what_ (description) {} 00441 00442 virtual const char* what () const throw () 00443 { 00444 std::stringstream ss; 00445 ss << "SerialException " << e_what_ << " failed."; 00446 return ss.str ().c_str (); 00447 } 00448 }; 00449 00450 class IOException : public std::exception 00451 { 00452 std::string file_; 00453 int line_; 00454 const char* e_what_; 00455 int errno_; 00456 public: 00457 explicit IOException (std::string file, int line, int errnum) 00458 : file_(file), line_(line), e_what_ (strerror (errnum)), errno_(errnum) {} 00459 explicit IOException (std::string file, int line, const char * description) 00460 : file_(file), line_(line), e_what_ (description), errno_(0) {} 00461 virtual ~IOException() throw() {} 00462 00463 int getErrorNumber () { return errno_; } 00464 00465 virtual const char* what () const throw () 00466 { 00467 std::stringstream ss; 00468 if (errno_ == 0) 00469 ss << "IO Exception: " << e_what_; 00470 else 00471 ss << "IO Exception (" << errno_ << "): " << e_what_; 00472 ss << ", file " << file_ << ", line " << line_ << "."; 00473 return ss.str ().c_str (); 00474 } 00475 }; 00476 00477 class PortNotOpenedException : public std::exception 00478 { 00479 const char * e_what_; 00480 public: 00481 PortNotOpenedException (const char * description) : e_what_ (description) {} 00482 00483 virtual const char* what () const throw () 00484 { 00485 std::stringstream ss; 00486 ss << e_what_ << " called before port was opened."; 00487 return ss.str ().c_str (); 00488 } 00489 }; 00490 00491 class SerialExceptionBase : public std::exception 00492 { 00493 00494 }; 00495 00496 } // namespace serial 00497 00498 #endif
1.8.0