2010-07-29 8 views
0

J'ai du code qui utilise l'API JavaComm. Il implémente SerialPortEventListener et la réception des caractères se fait de manière asynchrone. Cela fonctionne bien sauf que mon callback serialEvent est notifié après environ 17 caractères ont été reçus, pour mon analyse de paquet j'ai besoin d'être notifié quand < = 6 caractères ont été reçus. Est-il possible de configurer l'API série pour appeler l'async. notification quand un non spécifié. de caractères ont été reçus?Communications série Java: façon de définir le seuil de réception lors de l'utilisation asynchrone. Lire la notification

Merci, fred.

Répondre

1

Tout ce que vous obtenez est un flux et un SerialPortEvent.DATA_AVAILABLE lorsque les données sont disponibles dans le flux. Ce que vous pouvez faire est d'ajouter un niveau d'indirection et de créer votre propre écouteur qui sera appelé lorsque 6 caractères auront passé et simplement passer dans le tableau d'octets avec ces 6 caractères. J'ai ajouté où vous inséreriez le code ci-dessous. La mise en œuvre est à vous.

public void serialEvent(SerialPortEvent event) { 
    switch (event.getEventType()) { 
    case SerialPortEvent.BI: 
    case SerialPortEvent.OE: 
    case SerialPortEvent.FE: 
    case SerialPortEvent.PE: 
    case SerialPortEvent.CD: 
    case SerialPortEvent.CTS: 
    case SerialPortEvent.DSR: 
    case SerialPortEvent.RI: 
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
     break; 
    case SerialPortEvent.DATA_AVAILABLE: 
     byte[] readBuffer = new byte[20]; 

     try { 
     while (inputStream.available() > 0) { 
      int numBytes = inputStream.read(readBuffer); 
     } 
     // partition readBuffer into chunks of 6 bytes 
     ... 
     registeredListener.dataReceived(sixByteByteArray); 
     } catch (IOException e) { 
     } 
     break; 
    } 
    } 
+0

Merci pour la réponse Romain. Le problème que j'ai est que serialEvent n'est appelé qu'après env. 17 caractères sont reçus, et à la fin de l'analyse des 6 premiers caractères, j'ai besoin d'envoyer une réponse ACK, donc je suis effectivement notifié trop tard dans le rappel. Plus tard aujourd'hui, je vais essayer de définir la taille du tampon d'entrée sur le flux d'entrée à une petite valeur connue pour voir si cela a un effet. Merci - Fred –

+0

@fred basset - Si l'autre partie à qui vous comptez attend un ACK après 6 bvytes, alors pourquoi vous envoie-t-il plus de données? Il semble que votre protocole n'est pas bien défini. En réglant le tampon dans Java plus petit, vous n'allez pas modifier ce qui a déjà été reçu dans la puce UART. Vous avez un problème de protocole pas un problème de Java. –

+0

Romain, merci encore pour la réponse. La situation est que l'appareil m'enverra un paquet de 6 octets et attendra un ACK. Cependant, l'async. Le rappel en série n'est appelé qu'après que le système a reçu environ 17 octets. L'appareil m'a envoyé le premier paquet de 6 octets, mais je n'ai pas encore été averti de quoi que ce soit qui ait été reçu, donc il est retransmis parce qu'il n'obtient pas l'accusé de réception. Après environ la 3ème retransmission j'ai finalement reçu 17 octets et peut analyser les données et envoyer un accusé de réception, mais l'appareil a dû ré-émettre 3 fois. J'ai besoin de configurer en quelque sorte javacomm pour me notifier pour chaque octet –