|
serial
1.0
Cross-platform serial port library written in C++
|
00001 00036 #ifndef SERIAL_H 00037 #define SERIAL_H 00038 00039 #include <limits> 00040 #include <vector> 00041 #include <string> 00042 #include <cstring> 00043 #include <sstream> 00044 #include <exception> 00045 #include <stdexcept> 00046 #include <serial/v8stdint.h> 00047 00048 #define THROW(exceptionClass, message) throw exceptionClass(__FILE__, \ 00049 __LINE__, (message) ) 00050 00051 namespace serial { 00052 00056 typedef enum { 00057 fivebits = 5, 00058 sixbits = 6, 00059 sevenbits = 7, 00060 eightbits = 8 00061 } bytesize_t; 00062 00066 typedef enum { 00067 parity_none = 0, 00068 parity_odd = 1, 00069 parity_even = 2 00070 } parity_t; 00071 00075 typedef enum { 00076 stopbits_one = 1, 00077 stopbits_one_point_five, 00078 stopbits_two = 2 00079 } stopbits_t; 00080 00084 typedef enum { 00085 flowcontrol_none = 0, 00086 flowcontrol_software 00087 } flowcontrol_t; 00088 00095 struct Timeout { 00096 #ifdef max 00097 # undef max 00098 #endif 00099 static uint32_t max() {return std::numeric_limits<uint32_t>::max();} 00109 static Timeout simpleTimeout(uint32_t timeout) { 00110 return Timeout(max(), timeout, 0, timeout, 0); 00111 } 00112 00114 uint32_t inter_byte_timeout; 00116 uint32_t read_timeout_constant; 00120 uint32_t read_timeout_multiplier; 00122 uint32_t write_timeout_constant; 00126 uint32_t write_timeout_multiplier; 00127 00128 Timeout (uint32_t inter_byte_timeout_=0, uint32_t read_timeout_constant_=0, 00129 uint32_t read_timeout_multiplier_=0, uint32_t write_timeout_constant_=0, 00130 uint32_t write_timeout_multiplier_=0) 00131 : inter_byte_timeout(inter_byte_timeout_), 00132 read_timeout_constant(read_timeout_constant_), 00133 read_timeout_multiplier(read_timeout_multiplier_), 00134 write_timeout_constant(write_timeout_constant_), 00135 write_timeout_multiplier(write_timeout_multiplier_) 00136 {} 00137 }; 00138 00142 class Serial { 00143 public: 00173 Serial (const std::string &port = "", 00174 uint32_t baudrate = 9600, 00175 Timeout timeout = Timeout(), 00176 bytesize_t bytesize = eightbits, 00177 parity_t parity = parity_none, 00178 stopbits_t stopbits = stopbits_one, 00179 flowcontrol_t flowcontrol = flowcontrol_none); 00180 00182 virtual ~Serial (); 00183 00197 void 00198 open (); 00199 00204 bool 00205 isOpen () const; 00206 00208 void 00209 close (); 00210 00212 size_t 00213 available (); 00214 00240 size_t 00241 read (uint8_t *buffer, size_t size); 00242 00251 size_t 00252 read (std::vector<uint8_t> &buffer, size_t size = 1); 00253 00262 size_t 00263 read (std::string &buffer, size_t size = 1); 00264 00272 std::string 00273 read (size_t size = 1); 00274 00285 size_t 00286 readline (std::string &buffer, size_t size = 65536, std::string eol = "\n"); 00287 00297 std::string 00298 readline (size_t size = 65536, std::string eol = "\n"); 00299 00311 std::vector<std::string> 00312 readlines (size_t size = 65536, std::string eol = "\n"); 00313 00325 size_t 00326 write (const uint8_t *data, size_t size); 00327 00336 size_t 00337 write (const std::vector<uint8_t> &data); 00338 00347 size_t 00348 write (const std::string &data); 00349 00358 void 00359 setPort (const std::string &port); 00360 00367 std::string 00368 getPort () const; 00369 00404 void 00405 setTimeout (Timeout &timeout); 00406 00408 void 00409 setTimeout (uint32_t inter_byte_timeout, uint32_t read_timeout_constant, 00410 uint32_t read_timeout_multiplier, uint32_t write_timeout_constant, 00411 uint32_t write_timeout_multiplier) 00412 { 00413 Timeout timeout(inter_byte_timeout, read_timeout_constant, 00414 read_timeout_multiplier, write_timeout_constant, 00415 write_timeout_multiplier); 00416 return setTimeout(timeout); 00417 } 00418 00426 Timeout 00427 getTimeout () const; 00428 00441 void 00442 setBaudrate (uint32_t baudrate); 00443 00452 uint32_t 00453 getBaudrate () const; 00454 00463 void 00464 setBytesize (bytesize_t bytesize); 00465 00472 bytesize_t 00473 getBytesize () const; 00474 00482 void 00483 setParity (parity_t parity); 00484 00491 parity_t 00492 getParity () const; 00493 00501 void 00502 setStopbits (stopbits_t stopbits); 00503 00510 stopbits_t 00511 getStopbits () const; 00512 00521 void 00522 setFlowcontrol (flowcontrol_t flowcontrol); 00523 00530 flowcontrol_t 00531 getFlowcontrol () const; 00532 00534 void 00535 flush (); 00536 00538 void 00539 flushInput (); 00540 00542 void 00543 flushOutput (); 00544 00546 void 00547 sendBreak (int duration); 00548 00550 void 00551 setBreak (bool level = true); 00552 00554 void 00555 setRTS (bool level = true); 00556 00558 void 00559 setDTR (bool level = true); 00560 00575 bool 00576 waitForChange (); 00577 00579 bool 00580 getCTS (); 00581 00583 bool 00584 getDSR (); 00585 00587 bool 00588 getRI (); 00589 00591 bool 00592 getCD (); 00593 00594 private: 00595 // Disable copy constructors 00596 Serial(const Serial&); 00597 void operator=(const Serial&); 00598 const Serial& operator=(Serial); 00599 00600 std::string read_cache_; 00601 00602 // Pimpl idiom, d_pointer 00603 class SerialImpl; 00604 SerialImpl *pimpl_; 00605 00606 // Scoped Lock Classes 00607 class ScopedReadLock; 00608 class ScopedWriteLock; 00609 00610 // Read common function 00611 size_t 00612 read_ (uint8_t *buffer, size_t size); 00613 // Write common function 00614 size_t 00615 write_ (const uint8_t *data, size_t length); 00616 00617 }; 00618 00619 class SerialExecption : public std::exception 00620 { 00621 // Disable copy constructors 00622 void operator=(const SerialExecption&); 00623 const SerialExecption& operator=(SerialExecption); 00624 const char* e_what_; 00625 public: 00626 SerialExecption (const char *description) : e_what_ (description) {} 00627 SerialExecption (const SerialExecption& other) { 00628 e_what_ = other.e_what_; 00629 } 00630 00631 virtual const char* what () const throw () 00632 { 00633 std::stringstream ss; 00634 ss << "SerialException " << e_what_ << " failed."; 00635 return ss.str ().c_str (); 00636 } 00637 }; 00638 00639 class IOException : public std::exception 00640 { 00641 // Disable copy constructors 00642 void operator=(const IOException&); 00643 const IOException& operator=(IOException); 00644 std::string file_; 00645 int line_; 00646 const char* e_what_; 00647 int errno_; 00648 public: 00649 explicit IOException (std::string file, int line, int errnum) 00650 : file_(file), line_(line), e_what_ (strerror (errnum)), errno_(errnum) {} 00651 explicit IOException (std::string file, int line, const char * description) 00652 : file_(file), line_(line), e_what_ (description), errno_(0) {} 00653 virtual ~IOException() throw() {} 00654 IOException (const IOException& other) { 00655 e_what_ = other.e_what_; 00656 } 00657 00658 int getErrorNumber () { return errno_; } 00659 00660 virtual const char* what () const throw () 00661 { 00662 std::stringstream ss; 00663 if (errno_ == 0) 00664 ss << "IO Exception: " << e_what_; 00665 else 00666 ss << "IO Exception (" << errno_ << "): " << e_what_; 00667 ss << ", file " << file_ << ", line " << line_ << "."; 00668 return ss.str ().c_str (); 00669 } 00670 }; 00671 00672 class PortNotOpenedException : public std::exception 00673 { 00674 // Disable copy constructors 00675 void operator=(const PortNotOpenedException&); 00676 const PortNotOpenedException& operator=(PortNotOpenedException); 00677 const char * e_what_; 00678 public: 00679 PortNotOpenedException (const char * description) : e_what_ (description) {} 00680 PortNotOpenedException (const PortNotOpenedException& other) { 00681 e_what_ = other.e_what_; 00682 } 00683 00684 virtual const char* what () const throw () 00685 { 00686 std::stringstream ss; 00687 ss << e_what_ << " called before port was opened."; 00688 return ss.str ().c_str (); 00689 } 00690 }; 00691 00692 } // namespace serial 00693 00694 #endif
1.8.0