revise UART speed setting in setRaw()

not only Apple but also *BSD uses raw baudrate for cfset[io]speed().
If cfset[io]speed can accept raw value, set m_speed directly.

Otherwise (Linux) use bitmask like B115200.
This commit is contained in:
SASANO Takayoshi 2021-10-24 13:37:19 +09:00
parent a9fbbc1d2c
commit fc836f3812

View file

@ -294,53 +294,77 @@ bool CUARTController::setRaw()
termios.c_cc[VTIME] = 10; termios.c_cc[VTIME] = 10;
#endif #endif
#if !defined(B38400) || (B38400 != 38400)
switch (m_speed) { switch (m_speed) {
#if defined(B1200)
case 1200U: case 1200U:
::cfsetospeed(&termios, B1200); ::cfsetospeed(&termios, B1200);
::cfsetispeed(&termios, B1200); ::cfsetispeed(&termios, B1200);
break; break;
#endif /*B1200*/
#if defined(B2400)
case 2400U: case 2400U:
::cfsetospeed(&termios, B2400); ::cfsetospeed(&termios, B2400);
::cfsetispeed(&termios, B2400); ::cfsetispeed(&termios, B2400);
break; break;
#endif /*B2400*/
#if defined(B4800)
case 4800U: case 4800U:
::cfsetospeed(&termios, B4800); ::cfsetospeed(&termios, B4800);
::cfsetispeed(&termios, B4800); ::cfsetispeed(&termios, B4800);
break; break;
#endif /*B4800*/
#if defined(B9600)
case 9600U: case 9600U:
::cfsetospeed(&termios, B9600); ::cfsetospeed(&termios, B9600);
::cfsetispeed(&termios, B9600); ::cfsetispeed(&termios, B9600);
break; break;
#endif /*B9600*/
#if defined(B19200)
case 19200U: case 19200U:
::cfsetospeed(&termios, B19200); ::cfsetospeed(&termios, B19200);
::cfsetispeed(&termios, B19200); ::cfsetispeed(&termios, B19200);
break; break;
#endif /*B19200*/
#if defined(B38400)
case 38400U: case 38400U:
::cfsetospeed(&termios, B38400); ::cfsetospeed(&termios, B38400);
::cfsetispeed(&termios, B38400); ::cfsetispeed(&termios, B38400);
break; break;
#endif /*B38400*/
#if defined(B57600)
case 57600U:
::cfsetospeed(&termios, B57600);
::cfsetispeed(&termios, B57600);
break;
#endif /*B57600*/
#if defined(B115200)
case 115200U: case 115200U:
::cfsetospeed(&termios, B115200); ::cfsetospeed(&termios, B115200);
::cfsetispeed(&termios, B115200); ::cfsetispeed(&termios, B115200);
break; break;
#endif /*B115200*/
#if defined(B230400)
case 230400U: case 230400U:
::cfsetospeed(&termios, B230400); ::cfsetospeed(&termios, B230400);
::cfsetispeed(&termios, B230400); ::cfsetispeed(&termios, B230400);
break; break;
#endif /*B230400*/
#if defined(B460800)
case 460800U: case 460800U:
#if defined(__APPLE__)
::cfsetospeed(&termios, 460800);
::cfsetispeed(&termios, 460800);
#else
::cfsetospeed(&termios, B460800); ::cfsetospeed(&termios, B460800);
::cfsetispeed(&termios, B460800); ::cfsetispeed(&termios, B460800);
#endif
break; break;
#endif /*B460800*/
default: default:
LogError("Unsupported serial port speed - %u", m_speed); LogError("Unsupported serial port speed - %u", m_speed);
::close(m_fd); ::close(m_fd);
return false; return false;
} }
#else
::cfsetospeed(&termios, m_speed);
::cfsetispeed(&termios, m_speed);
#endif
if (::tcsetattr(m_fd, TCSANOW, &termios) < 0) { if (::tcsetattr(m_fd, TCSANOW, &termios) < 0) {
LogError("Cannot set the attributes for %s", m_device.c_str()); LogError("Cannot set the attributes for %s", m_device.c_str());