Como saber se o buffer de emissão da serial esta vazio

Boas,

Gostava de saber como posso testar se o buffer da serial esta vazio.

Pelos vistos o Serial.flush() faz, mas gostava de o fazer através dos registos, porque precisava que o teste seja realizado rapidamente.

Cumprimentos,

Zé tretas

O problema é que isso não é visto com registos…

Ou seja, quando fazes um Serial.print(), o que acontece é que todos esses dados vão para um buffer na memória do Arduino e depois o código da porta série vai transmitindo um a um à medida que as interrupções de envio (existe um registo a indicar o buffer vazio) vão sendo processadas.

Então podes, através de registos (bit TXC0 no registo UCSRA) saber quando um caracter foi enviado.

Para saberes quantos caracteres estão por enviar no buffer, podes usar o método availableForWrite() e calcular com base no tamanho do buffer os caracteres que estão por enviar.

https://www.arduino.cc/en/Serial/AvailableForWrite

Ou seja, se o retorno dessa função for o tamanho do buffer, ele está vazio.

Já agora, na minha instalação o tamanho do buffer é de 16 bytes para chips com menos de 1k de RAM e 64 bytes para chips com mais de 1k de RAM.

Não sei se isto responde à tua pergunta.

Boas,

J'a tentei com AvailableForWrite mas o resultado que obtive não foi o que eu esperava, mas vou tentar de novo, se calhar o meu código não era o mais correcto.

Cpts

Zé tretas

Eu creio que o availableforWrite indica o espaco de sobra no buffer… nao se o buffer esta vazio ou nao. Para isso terias de comparar o resultado do AvailableForWrite com o tamanho do buffer.

Dito isto, nunca experimentei essa funcao.

Boas,

Resumindo e concluindo nao sei usar o objecto vailableforWrite.

Fiz um Serial.print(SERIAL_TX_BUFFER_SIZE); para saber o tamanho do buffer que no mega é pelos visto de 64 bytes

fiz

int inQueue = SERIAL_TX_BUFFER_SIZE - Serial1.availableForWrite();

  while (inQueue <1)
  {
   Serial.print("\n\n\r Debug while tx"); 
  }

  Serial.print("\n\r inQueue -->> ");
  Serial.print(inQueue);

o resultado de Serial.print(inQueue); é sempre 15.

E o que eu queria fazer era enquanto tiver bytes no buffer bloquear o programa com o while mas já fiz varios testes e não estou a conseguir

tretas:
Boas,

Resumindo e concluindo nao sei usar o objecto vailableforWrite.

Fiz um Serial.print(SERIAL_TX_BUFFER_SIZE); para saber o tamanho do buffer que no mega é pelos visto de 64 bytes

fiz

int inQueue = SERIAL_TX_BUFFER_SIZE - Serial1.availableForWrite();

while (inQueue <1)
  {
  Serial.print("\n\n\r Debug while tx");
  }

Serial.print("\n\r inQueue -->> ");
  Serial.print(inQueue);




o resultado de ` Serial.print(inQueue);` é sempre 15.

E o que eu queria fazer era enquanto tiver bytes no buffer bloquear o programa com o while mas já fiz varios testes e não estou a conseguir

Ou eu estou a ver mal a coisa, ou então isso é normal. Se é escrita qualquer coisa exactamente antes de verificar o tamanho, o resultado vai ser sempre o mesmo, não?

Nao quereras fazer while inQueue > 1 ???

Eu nao tenho um mega comigo, mas para a semana que vem quando chegar a casa vou dar uma vista de olhos nesta funcao.

Boas,

Ou eu estou a ver mal a coisa, ou então isso é normal. Se é escrita qualquer coisa exactamente antes de verificar o tamanho, o resultado vai ser sempre o mesmo, não?

Mas teoricamente o while deveria bloquiar o programa e sendo assim não pode escrever nada no buffer pois não sai do while enquanto ele não estiver fazio.

Nao quereras fazer while inQueue > 1 ???

O resultado é o mesmo ou melhor não é o esperado.

Se usar o serial.flush() pelos vistos faz o que eu quero, mas o problema é que quando escrevo o escravo responde logo e perco metade da trama de resposta ;(

Cpts

Zé tretas