serial
1.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_hardware 00088 } flowcontrol_t; 00089 00096 struct Timeout { 00097 #ifdef max 00098 # undef max 00099 #endif 00100 static uint32_t max() {return std::numeric_limits<uint32_t>::max();} 00110 static Timeout simpleTimeout(uint32_t timeout) { 00111 return Timeout(max(), timeout, 0, timeout, 0); 00112 } 00113 00115 uint32_t inter_byte_timeout; 00117 uint32_t read_timeout_constant; 00121 uint32_t read_timeout_multiplier; 00123 uint32_t write_timeout_constant; 00127 uint32_t write_timeout_multiplier; 00128 00129 explicit Timeout (uint32_t inter_byte_timeout_=0, 00130 uint32_t read_timeout_constant_=0, 00131 uint32_t read_timeout_multiplier_=0, 00132 uint32_t write_timeout_constant_=0, 00133 uint32_t write_timeout_multiplier_=0) 00134 : inter_byte_timeout(inter_byte_timeout_), 00135 read_timeout_constant(read_timeout_constant_), 00136 read_timeout_multiplier(read_timeout_multiplier_), 00137 write_timeout_constant(write_timeout_constant_), 00138 write_timeout_multiplier(write_timeout_multiplier_) 00139 {} 00140 }; 00141 00145 class Serial { 00146 public: 00176 Serial (const std::string &port = "", 00177 uint32_t baudrate = 9600, 00178 Timeout timeout = Timeout(), 00179 bytesize_t bytesize = eightbits, 00180 parity_t parity = parity_none, 00181 stopbits_t stopbits = stopbits_one, 00182 flowcontrol_t flowcontrol = flowcontrol_none); 00183 00185 virtual ~Serial (); 00186 00200 void 00201 open (); 00202 00207 bool 00208 isOpen () const; 00209 00211 void 00212 close (); 00213 00215 size_t 00216 available (); 00217 00243 size_t 00244 read (uint8_t *buffer, size_t size); 00245 00254 size_t 00255 read (std::vector<uint8_t> &buffer, size_t size = 1); 00256 00265 size_t 00266 read (std::string &buffer, size_t size = 1); 00267 00275 std::string 00276 read (size_t size = 1); 00277 00288 size_t 00289 readline (std::string &buffer, size_t size = 65536, std::string eol = "\n"); 00290 00300 std::string 00301 readline (size_t size = 65536, std::string eol = "\n"); 00302 00314 std::vector<std::string> 00315 readlines (size_t size = 65536, std::string eol = "\n"); 00316 00328 size_t 00329 write (const uint8_t *data, size_t size); 00330 00339 size_t 00340 write (const std::vector<uint8_t> &data); 00341 00350 size_t 00351 write (const std::string &data); 00352 00361 void 00362 setPort (const std::string &port); 00363 00370 std::string 00371 getPort () const; 00372 00407 void 00408 setTimeout (Timeout &timeout); 00409 00411 void 00412 setTimeout (uint32_t inter_byte_timeout, uint32_t read_timeout_constant, 00413 uint32_t read_timeout_multiplier, uint32_t write_timeout_constant, 00414 uint32_t write_timeout_multiplier) 00415 { 00416 Timeout timeout(inter_byte_timeout, read_timeout_constant, 00417 read_timeout_multiplier, write_timeout_constant, 00418 write_timeout_multiplier); 00419 return setTimeout(timeout); 00420 } 00421 00429 Timeout 00430 getTimeout () const; 00431 00444 void 00445 setBaudrate (uint32_t baudrate); 00446 00455 uint32_t 00456 getBaudrate () const; 00457 00466 void 00467 setBytesize (bytesize_t bytesize); 00468 00475 bytesize_t 00476 getBytesize () const; 00477 00485 void 00486 setParity (parity_t parity); 00487 00494 parity_t 00495 getParity () const; 00496 00504 void 00505 setStopbits (stopbits_t stopbits); 00506 00513 stopbits_t 00514 getStopbits () const; 00515 00524 void 00525 setFlowcontrol (flowcontrol_t flowcontrol); 00526 00533 flowcontrol_t 00534 getFlowcontrol () const; 00535 00537 void 00538 flush (); 00539 00541 void 00542 flushInput (); 00543 00545 void 00546 flushOutput (); 00547 00549 void 00550 sendBreak (int duration); 00551 00553 void 00554 setBreak (bool level = true); 00555 00557 void 00558 setRTS (bool level = true); 00559 00561 void 00562 setDTR (bool level = true); 00563 00578 bool 00579 waitForChange (); 00580 00582 bool 00583 getCTS (); 00584 00586 bool 00587 getDSR (); 00588 00590 bool 00591 getRI (); 00592 00594 bool 00595 getCD (); 00596 00597 private: 00598 // Disable copy constructors 00599 Serial(const Serial&); 00600 void operator=(const Serial&); 00601 const Serial& operator=(Serial); 00602 00603 std::string read_cache_; 00604 00605 // Pimpl idiom, d_pointer 00606 class SerialImpl; 00607 SerialImpl *pimpl_; 00608 00609 // Scoped Lock Classes 00610 class ScopedReadLock; 00611 class ScopedWriteLock; 00612 00613 // Read common function 00614 size_t 00615 read_ (uint8_t *buffer, size_t size); 00616 // Write common function 00617 size_t 00618 write_ (const uint8_t *data, size_t length); 00619 00620 }; 00621 00622 class SerialExecption : public std::exception 00623 { 00624 // Disable copy constructors 00625 void operator=(const SerialExecption&); 00626 const SerialExecption& operator=(SerialExecption); 00627 const char* e_what_; 00628 public: 00629 SerialExecption (const char *description) : e_what_ (description) {} 00630 SerialExecption (const SerialExecption& other) { 00631 e_what_ = other.e_what_; 00632 } 00633 00634 virtual const char* what () const throw () 00635 { 00636 std::stringstream ss; 00637 ss << "SerialException " << e_what_ << " failed."; 00638 return ss.str ().c_str (); 00639 } 00640 }; 00641 00642 class IOException : public std::exception 00643 { 00644 // Disable copy constructors 00645 void operator=(const IOException&); 00646 const IOException& operator=(IOException); 00647 std::string file_; 00648 int line_; 00649 const char* e_what_; 00650 int errno_; 00651 public: 00652 explicit IOException (std::string file, int line, int errnum) 00653 : file_(file), line_(line), e_what_ (strerror (errnum)), errno_(errnum) {} 00654 explicit IOException (std::string file, int line, const char * description) 00655 : file_(file), line_(line), e_what_ (description), errno_(0) {} 00656 virtual ~IOException() throw() {} 00657 IOException (const IOException& other) { 00658 e_what_ = other.e_what_; 00659 } 00660 00661 int getErrorNumber () { return errno_; } 00662 00663 virtual const char* what () const throw () 00664 { 00665 std::stringstream ss; 00666 if (errno_ == 0) 00667 ss << "IO Exception: " << e_what_; 00668 else 00669 ss << "IO Exception (" << errno_ << "): " << e_what_; 00670 ss << ", file " << file_ << ", line " << line_ << "."; 00671 return ss.str ().c_str (); 00672 } 00673 }; 00674 00675 class PortNotOpenedException : public std::exception 00676 { 00677 // Disable copy constructors 00678 void operator=(const PortNotOpenedException&); 00679 const PortNotOpenedException& operator=(PortNotOpenedException); 00680 const char * e_what_; 00681 public: 00682 PortNotOpenedException (const char * description) : e_what_ (description) {} 00683 PortNotOpenedException (const PortNotOpenedException& other) { 00684 e_what_ = other.e_what_; 00685 } 00686 00687 virtual const char* what () const throw () 00688 { 00689 std::stringstream ss; 00690 ss << e_what_ << " called before port was opened."; 00691 return ss.str ().c_str (); 00692 } 00693 }; 00694 00695 } // namespace serial 00696 00697 #endif