質問

FTDI_SIOカーネルモジュールが提供する仮想シリアルポートを介して通信しようとしているUSBデバイスがあります。ただし、ポートのボーレートを14400に設定するのに苦労しています。

  • termios.h 14400の定数を指定していないので、使用できません cfsetispeedcfsetospeed.
  • FTDI_SIOカーネルモジュールのソースでは、Baudベースは24000000に設定されており、変更する方法はないようです。これは、私がカスタム除数を使用できないことを意味します TIOCSSERIAL ioctlとそのように14400ボーレートを取得します。
  • モジュールソースには、設定のように聞こえるコメントがあります alt_speed のメンバー tty_struct 14400へのポートの構造は、私が望むことを行いますが、既存のインターフェイスを考えると14400に設定する方法はないようです。

誰かがこれについて何かアイデアを持っていますか?カーネルモジュールをハッキングすることでこれを修正するのは非常に簡単ですが、カーネルの変更を必要としないソリューションを本当に探しています。

役に立ちましたか?

解決

ボーベースを変更することはできません。ハードウェア関連だと思います。したがって、モジュールをいじることはできません。 3番目のポイントでは、カスタムボードレートを設定するために提案された最初の方法についてのみ話します。 tty->alt_speed. 。少なくともFTDI_SIOドライバーでは、ユーザースペースからTTY structを直接設定するインターフェイスはないようです。
ただし、コメントには別の方法が説明されています。

     * 3. You can also set baud rate by setting custom divisor as follows
     *    - set tty->termios->c_cflag speed to B38400
     *    - call TIOCSSERIAL ioctl with (struct serial_struct) set as
     *      follows:
     *      o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
     *      o custom_divisor set to baud_base / your_new_baudrate

やってみましたか?

他のヒント

Shodanexのソリューションは、Linuxの下でNDI Polarisスペクトル(Baud 1.2Mbps)で動作します。指定されているとおり、B38400でシリアルデバイス(/dev/ttyusb0)を開きます。

int port = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
tcgetattr(port,&g_initialAtt);// save this to restore later
newAtt=g_initialAtt;
newAtt.c_cflag = B38400 | CS8 | CLOCAL | CREAD; 
cfmakeraw(&newAtt);
tcsetattr(port,TCSANOW,&newAtt);

次に実行します:

if(ioctl(port, TIOCGSERIAL, &sstruct) < 0){
    printf("Error: could not get comm ioctl\n"); 
    exit(0); 
}
sstruct.custom_divisor = custDiv;
//sstruct.flags &= 0xffff ^ ASYNC_SPD_MASK; NO! makes read fail.
sstruct.flags |= ASYNC_SPD_CUST; 
if(ioctl(port, TIOCSSERIAL, &sstruct) < 0){
    printf("Error: could not set custom comm baud divisor\n"); 
    exit(0); 
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top