2011-07-05 3 views
1

Je travaille avec un port COM. Je réussis à ouvrir le port COM et à faire tout le travail. Lors de la fermeture du port COM un accident se produit. Le code estErreur Rxtxcomm lors de la déconnexion

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

Erreur

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

Salut l'erreur est résolu .. Merci à tous – Deepu

+1

J'ai la même erreur. Comment avez-vous résolu? Merci! – Danilo

+0

@Deepu, Comment avez-vous résolu cette erreur? – mre

Répondre

1

J'ai réussi à trouver une solution qui semble résoudre le problème - il semble que si l'entrée et OutputStreams ne sont pas complètement fermés avant d'être la série Le port est, car ceux-ci fonctionnent dans leurs propres threads et sont pris dans leurs propres données. Ceci est résolu en ajoutant des mutex synchronisés qui garantissent que ces threads ont été correctement nettoyés avant la fermeture du port série.

Dans ma classe SerialConnection, j'ai ajouté des champs booléens, stopRead et stopWrite, pour indiquer quand les threads InputStream et OutputStream devaient s'arrêter respectivement. J'ai également ajouté mutexes stopReadMutex et stopWriteMutex pour synchroniser ces valeurs entre les threads principaux et en lecture/écriture. A chaque itération de leurs boucles, le lecteur et l'auteur vérifient les booléens stopRead et stopWrite et cassent leurs boucles.

Lorsque ma fonction de déconnexion est appelée, j'utilise les mutex pour modifier les valeurs stopRead et stopWrite avant d'appeler les fonctions proches des fils et SERIALPORT, comme indiqué ici respectifs:

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

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

Aussi, voici un lien vers le code source associé si quelqu'un veut regarder de plus près. http://pastebin.com/C4Fy8mLZ

0

L'erreur est due à des threads en conflit. La meilleure façon d'éviter cela est de faire toutes les méthodes synchronized:

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