Linux は、「ボー レート エイリアシング」と呼ばれる、非標準のボー レートに対して汚い方法を使用します。基本的に、シリアル ドライバに値をB38400
別の方法で解釈するように指示します。これはmemberのASYNC_SPD_CUST
フラグで制御されます。serial_struct
flags
次のように、カスタム速度の除数を手動で計算する必要があります。
// Configure port to use custom speed instead of 38400
ioctl(port, TIOCGSERIAL, &ss);
ss.flags = (ss.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;
ss.custom_divisor = (ss.baud_base + (speed / 2)) / speed;
closestSpeed = ss.baud_base / ss.custom_divisor;
if (closestSpeed < speed * 98 / 100 || closestSpeed > speed * 102 / 100) {
fprintf(stderr, "Cannot set serial port speed to %d. Closest possible is %d\n", speed, closestSpeed));
}
ioctl(port, TIOCSSERIAL, &ss);
cfsetispeed(&tios, B38400);
cfsetospeed(&tios, B38400);
もちろん、適切なbaud_base
除数設定のシリアル ドライバが必要です。前のスニペットでは 2% の偏差が許容されますが、これはほとんどの目的で問題ありません。
そして、ドライバーにB38400
38400 ボーとして再度解釈するように指示するには、次のようにします。
ioctl(mHandle, TIOCGSERIAL, &ss);
ss.flags &= ~ASYNC_SPD_MASK;
ioctl(mHandle, TIOCSSERIAL, &ss);
注意点: このメソッドが他の *nix フレーバー間で移植可能かどうかはわかりません。