3

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

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

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

4

2 に答える 2

4

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

     * 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

やってみましたか?

于 2010-07-07T07:21:40.707 に答える
3

Shodanexのソリューションは、LinuxでNDI Polaris Spectra(ボー1.2mbps)で動作します。指定されているように、シリアルデバイス(/ dev / ttyUSB0)をB38400で開きます。

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); 
}
于 2011-03-24T17:07:43.380 に答える