2011-07-05 10 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

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

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

Когда моя функция отключения называется, я использую мьютексы для изменения значений stopRead и stopWrite, прежде чем я называю близкие функции соответствующих потоков и 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

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

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