16

小さなターミナル アプリで ioctl を使用して RTS を設定できますが、Mac プラグイン コードでは設定できませんが、どちらも同じコードを実行します。プラグインでは、シリアルポートのフラグ/ピンを「取得」することしかできませんが、それらを「設定」することはできません。ターミナル アプリでは、「取得」と「設定」の両方を行うことができます。ENODEV のエラー番号が表示されます。エラー番号は 19 で、メッセージは「操作はデバイスでサポートされていません」です。

これがセキュリティ上の問題である場合 (ブラウザーのコンテキストにある場合)、ioctl でフラグを変更する許可を取得する方法はありますか? USBポートに接続されたシリアルデバイスがあります。FTDI vcp (virtual com port) ドライバーを使用しています。Windows側ではすべてがスムーズです。ところで、Safari と Firefox の両方を使用して同じ結果が得られます。以下は私のコードです:

int disableRTS ()
{
    char fd, ret, flags;

    // open device
    if ((fd = open("/dev/cu.mydevice", O_RDWR | O_NDELAY)) < 0)
    {
        fprintf(stderr, "failed to open device");
        return -1;
    }

    // Get the current state of the bits
    ioctl(fd, TIOCMGET, &flags);
    fprintf(stderr, "Flags are %x.\n", flags);    

    flags &= ~TIOCM_RTS;  // Disable the RTS bit
    ret = ioctl(fd, TIOCMSET, &flags);

    if (ret == -1)
        fprintf(stderr, "TIOCMSET failed\n");
    else
        fprintf(stderr, "TIOCMSET succeeded. flags: %x.\n", flags);

    return 0;
}

=========

アップデート

ブラウザ ページを更新してコードを強制的に再実行すると、ioctl() は成功を示す 0 を返します。残念ながら、初めて機能する必要があります。usleep() メソッドを使用してループと一時停止を記述し、その後試行しても失敗します。しかし、その後、リフレッシュすると成功します。また、Mozilla が提供する 2 つ目の NPAPI 専用プロジェクト「BasicPlugin.xcodeproj」でも問題を再現しました。私の最初のプラグイン プロジェクトは Firebreath プロジェクトです。どちらも最初は失敗し、ページのリロードで成功します。また、適切に動作する 2 つの個別の Mac アプリもあります。1 つは SerialTools で、RTS をオン (および DTR をオフ) に設定する方法は、ターミナル アプリとプラグインとまったく同じです。

========

更新 2

これについては、コード レベルの Apple サポートを得ることができたので、解決策が登場する可能性があります。エンジニアは、コードがプラグイン内とプラグイン外で異なる動作をするのは「奇妙」であると述べ、Safari プラグイン エンジニアと話しています。

4

2 に答える 2

1

答えは、ioctl() の呼び出しで TIOCMSET または TIOCMGET が使用される場合は常に、3 番目のパラメーターは int でなければならないということです。チャーを使っていました。当たり前。これを見逃したなんて信じられない。TIOCMSET および TIOCMGET は次のように定義されます。

  #define   TIOCMSET    _IOW('t', 109, int) /* set all modem bits */
  …
  #define   TIOCMGET    _IOR('t', 106, int) /* get all modem bits */

そのため、「フラグ」変数の型として char を使用すると、予期しない動作が発生する可能性があることは想像に難くありません。

于 2013-07-29T20:30:31.070 に答える