Rxtxcomm ошибка при отключении - PullRequest
2 голосов
/ 05 июля 2011

Я работаю с COM-портом. Я успешно открываю COM-порт и делаю всю работу. При закрытии COM-порта происходит сбой. Код

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

Error

#
> # 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.

Ответы [ 2 ]

1 голос
/ 31 мая 2012

Мне удалось найти решение, которое, кажется, решает проблему - кажется, что Input и OutputStreams не полностью закрываются перед последовательным портом, так как они работают в своих собственных потоках и оказываются захваченнымипо своим данным.Это решается добавлением синхронизированных мьютексов, которые обеспечивают правильную очистку этих потоков перед закрытием последовательного порта.

В своем классе SerialConnection я добавил логические поля stopRead и stopWrite, чтобы указать, когда потоки InputStream и OutputStream соответственноследует перестать слушать.Я также добавил мьютексы stopReadMutex и stopWriteMutex для синхронизации этих значений между основными потоками и потоками чтения / записи.На каждой итерации своих циклов читатель и писатель проверяют логические значения stopRead и stopWrite и разбивают их циклы.

Когда вызывается моя функция разъединения, я использую мьютексы для изменения значений stopRead и stopWrite перед вызовом closeфункции соответствующих потоков и serialPort, как показано здесь:

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 голосов
/ 19 октября 2012

Ошибка из-за конфликтующих потоков. Лучший способ избежать этого, это сделать все методы synchronized:

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