X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fio%2Funix%2Fserial.cpp;h=728f3d884d92dfeb42411da62466769d19126c73;hb=HEAD;hp=49d9e9c138da1afaad12cc485b331b96a117bb32;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00;p=libs%2Fcore.git diff --git a/source/io/unix/serial.cpp b/source/io/unix/serial.cpp index 49d9e9c..728f3d8 100644 --- a/source/io/unix/serial.cpp +++ b/source/io/unix/serial.cpp @@ -33,14 +33,14 @@ void Serial::platform_init(const string &port) } -void Serial::DeviceState::get_from(const Handle &handle) +void Serial::DeviceState::get_from(const Handle &h) { - tcgetattr(*handle, &state); + tcgetattr(*h, &state); } -void Serial::DeviceState::apply_to(const Handle &handle) +void Serial::DeviceState::apply_to(const Handle &h) { - if(tcsetattr(*handle, TCSADRAIN, &state)==-1) + if(tcsetattr(*h, TCSADRAIN, &state)==-1) throw system_error("tcsetattr"); } @@ -65,14 +65,29 @@ void Serial::DeviceState::set_baud_rate(unsigned baud) case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; - case 57600: speed = B57600; break; - case 115200: speed = B115200; break; - case 230400: speed = B230400; break; - default: throw invalid_argument("set_baud_rate"); + case 57600: speed = 0010001; break; + case 115200: speed = 0010002; break; + case 230400: speed = 0010003; break; + case 460800: speed = 0010004; break; + case 500000: speed = 0010005; break; + case 576000: speed = 0010006; break; + case 921600: speed = 0010007; break; + case 1000000: speed = 0010010; break; + case 1152000: speed = 0010011; break; + case 1500000: speed = 0010012; break; + case 2000000: speed = 0010013; break; + case 2500000: speed = 0010014; break; + case 3000000: speed = 0010015; break; + case 3500000: speed = 0010016; break; + case 4000000: speed = 0010017; break; + default: throw invalid_argument("Serial::set_baud_rate"); } - cfsetospeed(&state, speed); - cfsetispeed(&state, speed); + int ret = cfsetospeed(&state, speed); + if(ret==0) + ret = cfsetispeed(&state, speed); + if(ret<0) + throw invalid_argument("Serial::set_baud_rate"); } void Serial::DeviceState::set_data_bits(unsigned bits) @@ -84,7 +99,7 @@ void Serial::DeviceState::set_data_bits(unsigned bits) case 6: flag = CS6; break; case 7: flag = CS7; break; case 8: flag = CS8; break; - default: throw invalid_argument("set_data_bits"); + default: throw invalid_argument("Serial::set_data_bits"); } state.c_cflag = (state.c_cflag&~CSIZE)|flag; @@ -98,7 +113,7 @@ void Serial::DeviceState::set_parity(Serial::Parity par) case Serial::NONE: flag = 0; break; case Serial::EVEN: flag = PARENB; break; case Serial::ODD: flag = PARENB|PARODD; break; - default: throw invalid_argument("set_parity"); + default: throw invalid_argument("Serial::set_parity"); } state.c_cflag = (state.c_cflag&~(PARENB|PARODD))|flag; @@ -111,7 +126,7 @@ void Serial::DeviceState::set_stop_bits(unsigned bits) { case 1: flag = 0; break; case 2: flag = CSTOPB; break; - default: throw invalid_argument("set_stop_bits"); + default: throw invalid_argument("Serial::set_stop_bits"); } state.c_cflag = (state.c_cflag&~CSTOPB)|flag;