(仮想)シリアルポートを介してPCと通信するデバイスで作業しています。問題は、送信するデータがWindowsによってバスマウスとして誤って認識されることがあり、その後、「Microsoft Serial Ballpoint」ドライバーがロードされ、マウスポインターが画面上を飛び回り、ランダムにクリックすることです。
少しのグーグルは、それが通常の回避策が問題のドライバーを無効にするためのレジストリハッキングの少しであるシリアルデバイスで古くてよく知られている問題であることを明らかにします。ただし、ユーザーに要求するのは非常に多く、アプリケーションがユーザーのレジストリをいじらないようにしたいのです。特に、修正がWindowsのバージョンに依存しており、ユーザーがバスマウスを使用している場合はそうではありません。
代わりに、マウスと誤認される可能性のあるデータを送信しないようにプロトコルを変更して、問題を回避したいと思います。唯一の問題は、どのパターンを避けるべきかわからないということです。どうやらMicrosoftのマウスプロトコルは、最初のMSBが設定され、最後の3つのMSBがクリアされている4バイトのパケットで構成されているようです。
7ビットのみASCIIで十分ですか?検出されるのを心配する必要がある他のデバイスはありますか?
私はWindows 7 Professional x64
でこの問題に自分自身で遭遇しましたが、私のために働いた解決策はレジストリに入り、次の値を編集することでした:
Location: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\sermouse
Key: Start
Value: 3
Value
を4
に変更すると、この問題が発生しなくなります。
0 Boot (loaded by kernel loader). Components of the driver stack for the boot (startup) volume must be loaded by the kernel loader.
1 System (loaded by I/O subsystem). Specifies that the driver is loaded at kernel initialization.
2 Automatic (loaded by Service Control Manager). Specifies that the service is loaded or started automatically.
3 Manual. Specifies that the service does not start until the user starts it manually, such as by using Device Manager.
4 Disabled. Specifies that the service should not be started.
Reg editコマンドは次のとおりです。
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\sermouse" /V Start /T REG_DWORD /F /D 4
その後、コンピューターを再起動する必要がありますが、コンピューターは正しく起動し、シリアルマウスの検出は試行されません。
幸運を。
通常、Windowsでのマウス検出はserenum.sys
フィルタードライバーによって処理されます。このドライバーは、 serial plug-and-play とともにレガシーシリアルマウスのサポートを実装します。 Microsoftは、ソースコード WDKサンプルとして も提供しています。
検出中、ポートは1200-7-N-1モードに切り替わり、200ミリ秒以内に応答が予想されるDTR
+ RTS
をアサートします。障害が発生した場合は2、3回再試行します。残念ながら、従来のマウスの場合、単一のM
またはB
文字で十分です。
私たちの場合、プロトコルはこれらの文字を避けるために作り直され、今ではもう誤認されていないようです。
ただし、仮想USBシリアルポートを使用していました。従来のシリアルポートでは、異なるボーレートで送信されたものはすべてラインノイズのように見えるため、このアプローチはやや難しい場合があります。この場合、おそらく最も簡単な回避策は、既に提案されているように、未承諾送信を行わないようにすることです。
または、シリアル制御信号を実際に接続するか、USB CDCデバイスでインターセプトして、DTR
またはRTS
信号を処理し、出力を保留します。実際にプラグアンドプレイプロトコルを実装することは、さらに素晴らしいオプションです。おそらく、制御信号を完全に補うことのない安価なRS232ケーブルが存在するため、このアプローチは依然として失敗する可能性があります。
また、この問題に遭遇し、FTDIドライバーの高度なプロパティ(デバイスマネージャーのCOMポートのプロパティ)で「シリアル列挙子」を無効にすることで修正しました。これは http://www.ftdichip.com/Support/Documents/AppNotes/AN_107_AdvancedDriverOptions_AN_000073.pdf で説明されています。
私は自分でこのWindowsのバグに遭遇しました。このトピックに関する私自身の研究は次のとおりです。
マイクロソフトはこのバグを認めています。 http://support.Microsoft.com/kb/819036 ツールのダウンロードから始め、問題が解決するかどうかを確認します。
comdisable /list
プログラムを実行するとき。comdisable /disable COMx
ここで、xはポート番号です。うまくいけば、これは普遍的なソリューションとして機能するはずです。
または、boot.iniをハックすることもできますが、これはVista/Win 7では機能しないと思います。これを行う方法を説明するシスコシステムのアプリノートがあります。上記で問題が解決しない場合は、お知らせください。
「真の」シリアルポート、またはUSBドングル(RS-232、RS-485、それは問題ではない)を持っている場合、まず問題のシリアルポートを端末または任意のアプリケーションで開くことにより、この問題を回避できます。でそれを監視し、デバイスを接続するだけです。あなた自身のために、接続を終了する前にデバイスを削除することにも注意を払う必要があります。
FTDIチップがデバイス自体にはんだ付けされていると、あなたは破産します。 PCB会議Windowsコンピューターはユーザーフレンドリーではない可能性が高いので、それ自体で通信するデバイスがFTDIチップとペアリングされているという管理を説明するのに数ラウンドかかりました。キャビネット上でUSBソケットがどのように滑らかに見えるかは関係ありません...(ありがたいことに、これらの条件が一緒になることは非常にまれで珍しいことです)
FTDI FT232RLでも同じ問題がありましたが、これはPCBのハードウェアの問題であることがわかりました。
FTDI-Datasheetは、#RESET-Pin:Active Low Reset Pinについて述べています。これは、外部デバイスがFT232Rをリセットするために使用できます。不要な場合は、未接続のままにするか、VCCにプルアップできます。
RESET-Pinはアプリケーションでは必要なかったため、1kプルアップを介してVccに接続しました。 #RESET-Pinのプルアップは、FT232RLの未定義の起動を引き起こしたように見えました。少なくとも2コンバーターごとに、USBソケットに接続すると、deviveマネージャーでシリアルボールポイントが発生しました。 #RESET-Pinのプルアップ抵抗を取り外したため、#RESET-Pinは接続されていません。それ以来、すべてのインターフェイスは徹底的に機能し、Windowsデバイスマネージャーでシリアルボールポイントを作成しなくなりました。
この問題は2010年以降、シリアルスケールヘッドがPCに接続されていたために発生しました。 USBからシリアルへのコンバータかどうか。私は、SILABSデバイスのCP2102などを使用します。ドライバをインストールし、デバイスマネージャでマウス/ HIDAの下でボールポイントドライバを探して、単にドライバを無効にすることで回避しました。 、単に無効にするだけでアンインストールしないでください。その後、ドライバをインストールした状態でも再起動すると、Windowsはシリアルマウスとしてのポートを無視し、入力からのデータを使用するように見えます。また、ボールポイントドライバーがアクティブな場合、そのCOMportが使用中であり、アクセスできないCOMポートが返されることがあることがわかります。