Newsgroup: it.comp.java
Titolo: COM port data stream to TCP

Ciao a tutti,
ho un flusso di dati in input sulla porta COM che dovrei reinviare
tramite rete a pc remoti (possibilmente tramite multicast). Avete
qualche idea?
Ho già realizzato la trasmissione multicast di stringhe di caratteri,
ma questo flusso probabilmente non è un flusso di caratteri, perciò
vorrei effettuare un invio sulla rete di tutto ciò che viene ricevuto
sulla porta COM.
Spero possiate aiutarmi
Grazie
Carmelo

 ma questo flusso probabilmente non è un flusso di caratteri, perciò
e quindi? spara byte invece di caratteri, forse non capisco il problema.


Il codice che ho utilizzato è il seguente:
    // Reading on Serial Port
    try
    {
      byte[] buffer = new byte[4096];
      InputStream theInput = thePort.getInputStream();
      System.out.println("Reading serial port...");
      while (canRead()) // Loop
      {
        int bytesRead = theInput.read(buffer);
        if (bytesRead == -1)
          break;
        int nn;
        for (nn=0; buffer[nn]!='\r'; nn++);
        char[] toPrint = new char[nn];
        int i=0;
        for (i=0; i<nn; i++)
          toPrint[i] = (char)buffer[i];
        // Multicast della stringa
        String message = new String(toPrint);
        System.out.println(message);
        mc.netSend(message);
      }
      System.out.println("Stop Reading GPS serial port.");
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
- Riguardo la lettura da COM, dal codice si può vedere che ipotizzo
che la stringa finisca quando buffer[nn]=='\r', ma se i dati sono
binari questo non è detto che funzioni... Perciò vorrei trovare un
metodo per inviare "tutto", senza interpretazioni del contenuto...
- Riguardo l'invio in multicast, mc.netSend() è definito nel seguente
modo:
OutputStreamWriter out;
out = new OutputStreamWriter (new DatagramOutputStream (socket, group,
port), "UTF8");
public void netSend (String message) {
    try {
      out.write (message + "\n");
      out.flush ();
    } catch (IOException ex) {
      ex.printStackTrace ();
    }
  }
public class DatagramOutputStream extends ByteArrayOutputStream {
  public DatagramOutputStream (DatagramSocket socket, InetAddress
address, int port) {
    this (socket, address, port, 512);
  }
  DatagramSocket socket;
  DatagramPacket packet;
  public DatagramOutputStream (DatagramSocket socket, InetAddress
address, int port, int initialSize) {
    super (initialSize);
    this.socket = socket;
    packet = new DatagramPacket (new byte[0], 0, address, port);
  }
  public void flush () throws IOException {
    if (count >= 65508)
      throw new IOException ("Packet overflow (" + count + ") bytes");
    /* packet.setData (buf, 0, count); */
    packet.setData (buf);
    packet.setLength (count);
    socket.send (packet);
    reset ();
  }
}
Avete qualche idea in merito?

 Avete qualche idea in merito?
fatti un protocollo di comunicazione, ad es. un header di dimensione
fissa che contiene il numero di byte che seguono.
quindi ad es.
11 22 33 44
diventa
04 11 22 33 44
ipotizzando un header di un solo byte e quindi un payload di 255 byte al
massimo (FF)
chi riceve legge l'header e poi legge N byte in base all'header