[java] zend buffer over rs232

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • epic_gram
  • Registratie: April 2010
  • Laatst online: 16:06

epic_gram

undercover moderator

Topicstarter
Hoi,

Laatste tijd loop ik te rommelen met java, maar ik kom er niet helemaal uit. Ik heb een buffer opgebouwd uit bytes die ik wil versturen bij oproepen van een methode. Het betreft een RS232 interface die ik aanstuur met de welbekende RXTX bibliotheek. De interface werkt gewoon, en de software en alles doet het ook. Alleen hij stuurt alleen keyboard input, ik wil dus een byte array. Ik ben uitgegaan van het volgende programma:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class SerialWriter implements Runnable 
  {
    OutputStream out;

    public SerialWriter ( OutputStream out )
    {
        this.out = out;
    }

    public void run ()
    {

        try
        {                
            int c = 0;
            while ( ( c = System.in.read()) > -1 )

            {
                this.out.write(c);


            }                
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }            
    }
}


Als ik regel 16 vervang door een forloop en regel 10 een normale method naam geef, werkt het niet. Ik probeerde de functie aan te roepen. Ook met 1 hardcoded byte data om te verzenden, zonder forloop lukt het niet om de method aan te roepen.

Wie kan vertellen wat ik fout doe?

Het Centrale Vodka Topic! win een iPad! Kras hier met een sleutel of ander scherp voorwerp: ███████████


Acties:
  • 0 Henk 'm!

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 16:10
Je vergeet de flush methode aan te roepen om het geheel te verzenden. Dit is nodig om de 'transactie' te voltooien van jouw stream.

Als de run() methode maar één keer aangeroepen wordt, zou je ook met een final tevens close aan moeten roepen op de Stream om ervoor te zorgen dat er geen geheugenproblemen ontstaan.

EDIT: Kleine toevoeging trouwens, als je flush aanroept, dan doe je dat vaak op basis van een simpele delimiter die in je byte array voorkomt. Een delimiter zou een newline character kunnen zijn. Zo weet jouw code dan ook wanneer het einde (van de reeks) van commando's bereikt is.

[ Voor 22% gewijzigd door alex3305 op 15-01-2018 16:09 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sowieso is het handig om te kijken naar andere methodes van de Outputstream, je kunt ook in een keer een hele byte array versturen: https://docs.oracle.com/j...putStream.html#write(byte[])

En er is ook een overload die een gedeelte van een byte array verstuurd, dan hoef je niet zelf over de bytes te itereren

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • +1 Henk 'm!

  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Het is ook niet raar dat als je de naam van de run methode aanpast hij niet meer werkt. Met het gebruik van de interface Runnable geef je aan dat die functie er is en, zonder de library te kennen, waarschijnlijk gebruikt die library die functie wanneer er input word gedetecteerd oid. Sterker nog, als je de run functie hernoemt zou het niet eens mogen compileren omdat het niet voldoet aan de Runnable interface.