2011-07-05 8 views
1

私はCOMポートを使用しています。 COMポートを正常に開き、すべての作業を行います。 COMポートを閉じると、クラッシュが発生します。 コードがあるRxtxcomm切断時にエラーが発生する

public void close() 
    throws GPSException 
    { 
    if (serial_port_ != null) 
     serial_port_.close(); 
    } 

私は問題を解決するために表示される解決策を見つけることができた

# 
> # An unexpected error has been detected by Java Runtime Environment: 
> # 
> # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x04049e69, pid=5692, 
> tid=4100 
> # 
> # Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing 
> windows-x86) 
> # Problematic frame: 
> # C [rxtxSerial.dll+0x9e69] 
> # 
> # If you would like to submit a bug report, please visit: 
> # http://java.sun.com/webapps/bugreport/crash.jsp 
> # The crash happened outside the Java Virtual Machine in native code. 
> # See problematic frame for where to report the bug. 
+0

こんにちはエラーが..私は同じエラーを持っているすべての – Deepu

+1

のおかげで解決されます。どのように解決しましたか?ありがとう! – Danilo

+0

@Deepu、どうやってこのエラーを解決しましたか? – mre

答えて

1

エラー - 入力とOutputStreamsが完全にシリアル前にクローズされていないかのように思えますポートは、自分のスレッドで実行されているので、自分のデータに巻き込まれています。これは、シリアルポートが閉じられる前にこれらのスレッドが適切にクリーンアップされていることを保証する同期ミューテックスを追加することによって解決されます。

私のSerialConnectionクラスでは、InputStreamストリームとOutputStreamスレッドがそれぞれリッスンを停止する必要があることを示すために、booleanフィールドstopReadとstopWriteを追加しました。また、mutexのstopReadMutexとstopWriteMutexを追加して、これらの値をメインスレッドと読み書きスレッドの間で同期させました。ループの各反復、リーダーとライターは、stopReadとstopWriteブール値をチェックし、ループを解除します。

私の切断機能が呼び出されると、ここで示したように、私は、私はそれぞれのスレッドとSERIALPORTの密接な機能を呼び出す前にstopReadとstopWrite値を変更するためにミューテックスを使用します。

public void disconnect(){ 
    try { 
     synchronized(stopReadMutex) 
     {stopRead = true;} 
     synchronized(stopWriteMutex) 
     {stopWrite = true;} 

     portOut.close(); 
     portIn.close(); 
     serialPort.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

また、ここれます誰かがもっと詳しく見たいと思っているなら、関連するソースコードへのリンク。 http://pastebin.com/C4Fy8mLZ

0

エラーはスレッドの競合によるものです。これを回避する最善の方法は、すべてのメソッド​​を作ることです。

public synchronized void disconnect() { 
    serialPort.close(); 
}