Linux/Custom Buad Rate

Usage
screen /dev/ttyUSB3

linux-custom-baudrate /dev/ttyUSB3 115200

linux-custom-baudrate /dev/ttyUSB3 195360
 * 1) linux-custom-baudrate: actual baudrate is 60000000 / 307 = 195439.734375

Source
linux-custom-baudrate.c:
 * 1) include 
 * 2) include 
 * 3) include 
 * 4) include 
 * 5) include 

static int rate_to_constant(int baudrate) { switch(baudrate) { B(50);    B(75);     B(110);    B(134);    B(150); B(200);   B(300);    B(600);    B(1200);   B(1800); B(2400);  B(4800);   B(9600);   B(19200);  B(38400); B(57600); B(115200); B(230400); B(460800); B(500000); B(576000); B(921600); B(1000000);B(1152000);B(1500000); default: return 0; } }
 * 1) define B(x) case x: return B##x
 * 1) undef B

/* Open serial port in raw mode, with custom baudrate if necessary */ int serial_open(const char *device, int rate) {	struct termios options; struct serial_struct serinfo; int fd; int speed = 0;

/* Open and configure serial port */ if ((fd = open(device,O_RDWR|O_NOCTTY)) == -1) return -1;

speed = rate_to_constant(rate);

if (speed == 0) { /* Custom divisor */ serinfo.reserved_char[0] = 0; if (ioctl(fd, TIOCGSERIAL, &serinfo) < 0) return -1; serinfo.flags &= ~ASYNC_SPD_MASK; serinfo.flags |= ASYNC_SPD_CUST; serinfo.custom_divisor = (serinfo.baud_base + (rate / 2)) / rate; if (serinfo.custom_divisor < 1) serinfo.custom_divisor = 1; if (ioctl(fd, TIOCSSERIAL, &serinfo) < 0) return -1; if (ioctl(fd, TIOCGSERIAL, &serinfo) < 0) return -1; if (serinfo.custom_divisor * rate != serinfo.baud_base) { warnx("actual baudrate is %d / %d = %f",			     serinfo.baud_base, serinfo.custom_divisor,			      (float)serinfo.baud_base / serinfo.custom_divisor); }	}

fcntl(fd, F_SETFL, 0); tcgetattr(fd, &options); cfsetispeed(&options, speed ?: B38400); cfsetospeed(&options, speed ?: B38400); cfmakeraw(&options); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~CRTSCTS; if (tcsetattr(fd, TCSANOW, &options) != 0) return -1;

return fd; }

void main(int argc, char *argv[]) {   if (serial_open(argv[1], atoi(argv[2])) < 0) {       fprintf(stderr, "failed\n"); }   pause; }

Source: https://jim.sh/ftx/files/linux-custom-baudrate.c

Reference:
 * linux - C code for non-standard baud rate on Debian/Raspberry Pi - Stack Overflow - http://stackoverflow.com/questions/23492088/c-code-for-non-standard-baud-rate-on-debian-raspberry-pi

Compile
gcc linux-custom-baudrate.c -o linux-custom-baudrate

cp linux-custom-buadrate /usr/local/sbin/