2009-12-28[n年前へ]
■VISTAで使うUSB接続シリアルポート+wincom.rb
「TEXCELLのRubyシリアル通信ライブラリ wincom.rb で、(WindowsXP上では受信できるのに)Windows VISTA上では、レガシーなCOM1ではデータ受信できるが、(Prolificのチップ・ドライバーを使った)USB I/F接続シリアルポート接続では受信できなかった」という記事を読んだ。原因は、
Vista環境にて、USB接続シリアルポートでは、(Windows APIの)ReadFileを実行した際、「読み取ったバイト数」として常にゼロが帰ってくるため。ということで、USBシリアルI/Fドライバのバグらしいが、考えてみれば、「VISTAマシンでシリアル接続をしたことがないことに気づいたこと」「ATEN製UC-232A・シグマAPO製URS232GFと同タイプを使う可能性もあること」から、リンク先の記事にあった対処法を自分用に書き写しておく。機会があれば、自分でも確認してみよう、と思う。
対処法:ReadFileの「読み取ったバイト数」は使わず、ClearCommErrorを実行した際に得られたCOMSTAT構造体の「受信バッファにあるデータ・バイト数」を使う(常に0バイトよりはマシだ)。def receive # rcvchar=@wcrecv.unpack("a#{irlen[0]}")[0] rcvchar=@wcrecv.unpack("a#{ilen}")[0]