我正在使用COM端口。 我成功打开了COM端口并完成了所有工作。关闭COM端口时会发生崩溃。 代码是
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 :(得分:1)
我设法找到一个似乎可以解决问题的解决方案 - 似乎在串口之前没有完全关闭Input和OutputStreams,因为它们在自己的线程中运行并且被赶上了在他们自己的数据中。这可以通过添加同步互斥锁来解决,这些互斥锁可确保在串口关闭之前正确清理这些线程。
在我的SerialConnection类中,我添加了boolean fields,stopRead和stopWrite,以指示InputStream和OutputStream线程何时应该停止侦听。我还添加了互斥锁stopReadMutex和stopWriteMutex来在主线程和读/写线程之间同步这些值。它们的循环的每次迭代,读取器和编写器检查stopRead和stopWrite布尔值并打破它们的循环。
当调用我的断开连接函数时,我在调用各个线程和serialPort的close函数之前使用互斥锁更改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
答案 1 :(得分:0)
错误是由于线程冲突造成的。避免这种情况的最佳方法是制作所有方法synchronized
:
public synchronized void disconnect() {
serialPort.close();
}