diff --git a/main.cpp b/main.cpp index d73431e..7ebae46 100644 --- a/main.cpp +++ b/main.cpp @@ -77,7 +77,6 @@ static int parseCmdArgs(int argc, char** argv, Config *config) { config->noSerial=true; } - else if (std::string(argv[i]) == "-r" || std::string(argv[i]) == "--rates") { printRates(); @@ -135,12 +134,32 @@ int openSerialPort(const Config& config) return serial; } -void serialConnect(const Config& config, int* serial) +int serialPortReconnect(Config& config, std::string err) { - if(*serial != -1) - close(*serial); - std::cout<<"Using serial port: "<run(&clients, serial, config.verbose); + { + try + { + client->run(&clients, serial, config.verbose); + } + catch(serialIoException& ex) + { + close(serial); + serialPortReconnect(config, ex.what()); + } + } if((ev.events & (EPOLLHUP | EPOLLERR)) || client->isDisconnected()) { client->cleanUp(); @@ -227,8 +256,8 @@ int main(int argc, char* argv[]) ssize_t readlen = sRead(serial, buffer, 4096); if(readlen < 0 && (errno != EAGAIN || errno != EWOULDBLOCK)) { - std::cout<<"Serial port error reconnecting\n"; - serialConnect(config, &serial); + close(serial); + serialPortReconnect(config, strerror(errno)); } if(config.verbose) { diff --git a/serial_io.h b/serial_io.h index f0c99b3..0e78d0f 100644 --- a/serial_io.h +++ b/serial_io.h @@ -7,6 +7,7 @@ #ifdef __cplusplus #include #include +#include #endif #define BAUDRATE B38400 @@ -32,7 +33,7 @@ class serialIoException: public std::runtime_error int fd; int errorNumber; serialIoException(int fd_, int errorNumber_): - std::runtime_error("file descriptor error, fd: " + std::to_string(fd_) + " errno: " + std::to_string(errorNumber_) + "\n"), fd(fd_), errorNumber(errorNumber_) + std::runtime_error("file descriptor error, fd: " + std::to_string(fd_) + " error: " + strerror(errorNumber_) + "\n"), fd(fd_), errorNumber(errorNumber_) {} }; #endif