JavaComm - Tempo entre bytes [RESOLVIDO]

Alguém sabe como faço pra controlar o tempo entre bytes com o JavaComm?

Você quer aumentar o número de “stop bits” ou então não quer mandar um caminhão de bytes de uma vez?

Eu mando um array de 8 bytes pra um CLP (um pequeno e robusto computador industrial).
O cara que programa a BIOS do CLP disse que a velocidade de envio dos bytes está alta. Não a velocidade das mensagens (que tem 8 bytes), mas sim o tempo entre um byte e outro… eu preciso dar uma “pausa” de alguns milisegundos entre um byte e outro…

Hum - quando eu tinha esse tipo de problemas, eu me lembrava de mandar um byte de cada vez, e esperar manualmente com Thread.sleep entre cada byte. Só não sei se existe algum método “flush” ou coisa parecida que faça com que os dados que estão no buffer de saída sejam imediatamente enviados ou não.

nao tentei enviar mensagens de 1 byte… pode ser q de certo… vou fazer uns testes…
Mas, na verdade, acho q num vai nao… pq ele ta programado pra receber mensagens de 8 bytes… daí num sei se ele vai pegar 8 mensagens e entender como 1…

E isso é coisa complicada de mudar no CLP, tem que ser aqui no código do java mesmo…

Ora, amigo: você cria as suas mensagens como sendo de 8 bytes. Só que você manda as mensagens 1 byte de cada vez. É o PLC que deve entender corretamente as tais mensagens. (Eu cansei de ver tais equipamentos que realmente não suportam que você mande os bytes pela serial sem um intervalo razoável entre os bytes, maior que a quantidade de stop bits que seria necessário para separar os bytes.)

Bem, aqui também tivemos esse mesmo problema, e também resolvemos como o Thingol falou:

[code]
private void sendPerByte(ByteBuffer data) throws IOException {
assert (interByteTime > 0);

    byte[] bytes = data.array();

    for (byte b : bytes) {
        out.write(b);
        out.flush();
        try {
            Thread.sleep(interByteTime);
        } catch (InterruptedException e) {
            UtilLog.thrown(getClass(), "sendData", e);
        }
    }
}[/code]

Muitas aplicações feitas para humanos também contam que o sujeito não vai conseguir digitar tudo de uma vez… mas não contam que uma máquina possa fazer esse trabalho. Por isso, essa gambi tem que ser feita.

Num eh que deu certo… :slight_smile:
Valeu Thingol !!

Muitos hardwares são de concepção bastante antiga e simples, e deixam o mesmo processador tomando conta da parte de controle (OK) e de comunicação (argh), então é por isso que você precisa deixar um intervalo entre bytes, já que eles não têm um chip dedicado para comunicação serial como o INS16550 (que tem um buffer de 16 bytes para entrada e/ou saída de bytes).

Agora só num to acertando qual é esse tempo…rs
5ms - nao
50ms- nao
500ms - nao, deve ser menos…rsrsrs