1
0
mirror of https://github.com/wjwwood/serial.git synced 2026-01-23 04:04:54 +08:00

Merge branch 'boostless' of https://github.com/wjwwood/serial into boostless

This commit is contained in:
William Woodall 2012-01-23 14:28:19 -06:00
commit 2be24ab23c
5 changed files with 94 additions and 34 deletions

View File

@ -1,5 +1,6 @@
#include <string>
#include <iostream>
#include <stdio.h>
#include <boost/thread.hpp>
@ -7,14 +8,17 @@
int run(int argc, char **argv)
{
if(argc < 2) {
std::cerr << "Usage: test_serial <serial port address>" << std::endl;
if(argc < 3) {
std::cerr << "Usage: test_serial <serial port address> <baudrate>" << std::endl;
return 0;
}
std::string port(argv[1]);
unsigned long baud = 0;
sscanf(argv[2], "%lu", &baud);
// port, baudrate, timeout in milliseconds
serial::Serial serial(port, 115200, 250);
serial::Serial serial(port, baud, 250);
std::cout << "Is the serial port open?";
if(serial.isOpen())

View File

@ -83,38 +83,52 @@ typedef enum {
FLOWCONTROL_HARDWARE
} flowcontrol_t;
class SerialExecption : public std::exception {
const char * e_what;
class SerialExecption : public std::exception
{
const char* e_what_;
public:
SerialExecption(const char *description) {e_what=description;};
virtual const char* what() const throw() {
SerialExecption (const char *description) : e_what_ (description) {}
virtual const char* what () const throw ()
{
std::stringstream ss;
ss << "SerialException " << this->e_what << " failed.";
return ss.str().c_str();
ss << "SerialException " << e_what_ << " failed.";
return ss.str ().c_str ();
}
};
class IOException : public std::exception {
const char * e_what;
class IOException : public std::exception
{
const char* e_what_;
int errno_;
public:
IOException(const char * description) {e_what = description;}
explicit IOException (int errnum) : e_what_ (strerror (errnum)), errno_(errnum) {}
explicit IOException (const char * description) : e_what_ (description), errno_(0) {}
virtual const char* what() const throw() {
int getErrorNumber () { return errno_; }
virtual const char* what () const throw ()
{
std::stringstream ss;
ss << "IO Exception " << this->e_what << " failed.";
return ss.str().c_str();
if (errno_ == 0)
ss << "IO Exception " << e_what_ << " failed.";
else
ss << "IO Exception " << errno_ << ":" << e_what_ << " failed.";
return ss.str ().c_str ();
}
};
class PortNotOpenedException : public std::exception {
const char * e_what;
class PortNotOpenedException : public std::exception
{
const char * e_what_;
public:
PortNotOpenedException(const char * description) {e_what = description;}
PortNotOpenedException (const char * description) : e_what_ (description) {}
virtual const char* what() const throw() {
virtual const char* what () const throw ()
{
std::stringstream ss;
ss << e_what << " called before port was opened.";
return ss.str().c_str();
ss << e_what_ << " called before port was opened.";
return ss.str ().c_str ();
}
};

View File

@ -64,7 +64,19 @@ Serial::SerialImpl::open ()
if (fd_ == -1)
{
throw IOException ("invalid file descriptor");
switch (errno)
{
case EINTR:
// Recurse because this is a recoverable error.
open ();
return;
case ENFILE:
case EMFILE:
throw IOException ("to many file handles open");
break;
default:
throw IOException (errno);
}
}
reconfigurePort();
@ -215,7 +227,7 @@ Serial::SerialImpl::available ()
}
else
{
throw IOException ("ioctl");
throw IOException (errno);
}
}
@ -244,8 +256,7 @@ Serial::SerialImpl::read (char* buf, size_t size)
if (r == -1)
{
perror("select()");
exit(EXIT_FAILURE);
throw IOException (errno);
}
}
@ -276,12 +287,27 @@ Serial::SerialImpl::read (char* buf, size_t size)
size_t
Serial::SerialImpl::write (const string &data)
{
if (isOpen_ == false) {
if (isOpen_ == false)
{
throw PortNotOpenedException ("Serial::write");
}
ssize_t n = ::write (fd_, data.c_str (), data.length ());
if (n == -1) {
throw IOException ("Write");
if (n != static_cast<ssize_t> (data.length ()))
{
throw IOException ("Write did not complete");
}
else if (n == -1)
{
if (errno == EINTR)
{
return write (data);
}
else
{
throw IOException (errno);
}
}
return static_cast<size_t> (n);
}

View File

@ -167,7 +167,7 @@ Serial::readlines(string eol)
{
if (pimpl_->getTimeout () < 0)
{
throw "Error, must be set for readlines";
throw invalid_argument ("Error, must be set for readlines");
}
size_t leneol = eol.length ();
vector<string> lines;
@ -339,3 +339,4 @@ bool Serial::getCD ()
{
return pimpl_->getCD ();
}

View File

@ -0,0 +1,15 @@
#!/usr/bin/env python
import serial, sys
if len(sys.argv) != 2:
print "python: Usage_serial_test <port name like: /dev/ttyUSB0>"
sys.exit(1)
sio = serial.Serial(sys.argv[1], 115200)
sio.timeout = 250
while True:
sio.write("Testing.")
print sio.read(8)