小さなターミナル アプリで 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 プラグイン エンジニアと話しています。