最終的に、この問題は Java クラスのポート所有権でのみ解決できました。フレーミングの問題のためだと思います。
次のような所有権ハンドラーを作成しました
シリアル ポートの所有権の管理 (rxtx で)
jrubyでは次のようになります
class SerialOwnershipHandler
include CommPortOwnershipListener
def initialize serial_port
@serial_port = serial_port
@id = serial_port.id
@port_name = serial_port.port_name
end
def ownershipChange type
case type
when CommPortOwnershipListener::PORT_OWNED
p @id.to_s + " OwnershipListener: got the port for " + @port_name.to_s
#break
when CommPortOwnershipListener::PORT_UNOWNED
p @id.to_s + " OwnershipListener: just lost it's port ownership for " + @port_name.to_s
#break
when CommPortOwnershipListener::PORT_OWNERSHIP_REQUESTED
p @id.to_s + " OwnershipListener: someone is asking port ownership for " + @port_name.to_s
@serial_port.close
#break
end
end...
シリアルポートクラスの初期化メソッドで呼び出します
@serial_ownership_handler = SerialOwnershipHandler.new self ## implements CommPortOwnershipListener
@port_id.add_port_ownership_listener @serial_ownership_handler
デメリットばかり。複数のオープン ラインを持つことはできません。別の接続 (ポートを要求する側) を開く前に、常に 1 つの接続を閉じる必要があります。