Olá,

estou desenvolvendo uma interface C++ Builder 6 utilizando para acesso o componente TComport 4.11.
O arduino está como um interpretador de comandos fazendo leituras da serial.
O meu problema reside no fato de que quando envio somente um comando dentro de uma ação, por exemplo um botão, ele executa. Porém há casos onde tenho que enviar mais de um comando e ele não executa.
Ex de chamada do programa:
void....buttonClick(){
comport->writeString("comando1");
}

ele executa normal
se mando dois comandos
comport->writeString("comando1");
comport->writeString("comando2");

ele não executa nenhum.

qual seria a melhor forma de tratar isso?
eu resolvi mandando um \n ao final de cada comando e no arduino utilizei a leitura readStringUntil(\n) porém penso que possa existir algo melhor ou mais adequado.

aceito sugestões.

grato
Teodoro

SOLUÇÃO UTILIZADA

modifiquei o programa de interface deixando ele como escrava executando uma thread que fica realizando a leitura da serial.

Exibições: 614

As respostas para este tópico estão encerradas.

Respostas a este tópico

Oi TO, bom dia.

Ficaram criados dois tópicos seu.

Sugiro deletar um.

Agora quanto ao seu problema com o arduino, anexe um arquivo com a copia do seu código,pra que possamos

ter uma visão mais completa dele e possivelmente sugerir melhorias.

Rui

Teodoro, boa noite!

Acho que a solução que você deu está boa, principalmente se funcionou do jeito que você queria.

Quando você envia dados pela serial com essa lib, você pode fazer de forma síncrona ou assíncrona.

O padrão é síncrona.

Por isso, talvez a aplicação não enviou todos os dados ao Arduino.

Faça um teste com o seguinte comando para enviar de forma assíncrona:

comport->writeString("comando1",False);
comport->writeString("comando2",False);

 

Outras possibilidades para o C++ Builder:

- Algumas libs possuem o comando WriteLnString que já adiciona o "\n" no final

- Procure por um método que limpe o buffer, enviando tudo que está represado. Pode ser algo como flush ou clear

- Verifique no manual como enviar pelo modo assíncrono ou síncrono

Oi TO, boa tarde.

Experimenta colocar uma linha de delay de +- 10 ms  entre as leitura da serial. pra dar tempo dela recarregar o buffer.

Aqui:

recebido = Serial.readStringUntil('\n');

delay(10);
//realiza as comparações
//SISTEMA OPERANDO

Rui

Qual Arduino esta usando ?

Será que teria que receber primeiramente a resposta OK do Arduino , para enviar o segundo comando ? 

comport->writeString("comando1");

Resposta OK do Arduino ?


comport->writeString("comando2");

Resposta OK do Arduino ?

Se não verifica a comunicação, como terá certeza que ela ocorreu ?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço