HOWTO · Arduino

Arduino Serial Flush

Pode-se verificar se a transmissão serial é feita ou não através da função Serial.flush().

Nesta página

No Arduino, Serial.flush() aguarda até que os dados seriais enviados terminem de ser transmitidos. A função não apaga dados recebidos nem confirma que outro dispositivo recebeu ou processou a mensagem. Use-a quando a próxima etapa depender do Arduino concluir a transmissão atual.

O que Serial.flush() faz no Arduino?

Serial.flush() bloqueia a execução do sketch enquanto os dados de saída enfileirados são enviados pela interface serial. Quando a função retorna, o Arduino pode continuar com a próxima operação. Isso é útil quando a transmissão precisa terminar antes de uma ação seguinte, como mudar o pino de direção de um transceptor de transmissão para recepção.

A função atua no caminho de transmissão de saída. Ela não limpa o buffer de recepção nem informa se um sensor ou computador conectado entendeu os dados. Se precisar de confirmação, defina uma troca de mensagens e aguarde uma resposta do outro dispositivo.

Como usar Serial.flush() em um sketch do Arduino

Esta sequência de chamadas no Arduino envia uma linha, aguarda o fim da transmissão de saída e então continua. Ajuste a taxa de transmissão e a mensagem ao dispositivo conectado à placa. O programa C++ completo abaixo usa uma pequena implementação local que simula Serial para demonstrar a sequência em um computador; ao adaptar o sketch, substitua essa implementação pelo núcleo Arduino da sua placa.

#include <iostream>

class SerialPort {
public:
  void begin(unsigned long baud) { (void)baud; }
  void println(const char* message) { std::cout << message << '\n'; }
  void flush() {}
};

SerialPort Serial;

void setup() {
  Serial.begin(9600);
  Serial.println("Starting transmission...");
  Serial.flush();
  Serial.println("Transmission finished; continuing.");
}

int main() {
  setup();
  return 0;
}
Starting transmission...
Transmission finished; continuing.

Em uma placa, use o objeto Serial fornecido pelo Arduino e o núcleo apropriado para a placa. A implementação simulada no computador apenas demonstra onde a chamada aparece na sequência; ela não reproduz a transmissão elétrica nem verifica se um receptor processou a primeira linha. Para testar com hardware, compile e carregue o sketch na sua placa e observe a saída em um monitor serial configurado para 9600 baud.

Diferenças entre flush() do PySerial e do Arduino

Em um programa Python que usa PySerial, ser.flush() também aguarda até que os dados de saída pendentes sejam escritos. Esse método pertence ao objeto Serial do PySerial, enquanto Serial.flush() pertence a uma interface serial do Arduino. Ambos tratam de dados enviados; nenhum deles, por si só, aguarda uma confirmação no nível da aplicação ou limpa os dados recebidos.

Para confirmar o recebimento de forma confiável, faça o Arduino enviar uma resposta depois de analisar e processar um comando. Então, o programa Python pode ler e validar essa resposta. Mantenha essa etapa do protocolo separada de ser.flush(): esvaziar a saída garante que o computador terminou de escrever os dados pendentes, enquanto a resposta informa o que o Arduino fez. O nome de uma porta serial, como COM3, depende do sistema operacional; configure a porta e a taxa de transmissão de acordo com o seu ambiente.

Perguntas comuns sobre a limpeza da transmissão serial

Serial.flush() limpa o buffer de recepção? Não. A função aguarda o término da transmissão dos dados de saída. Para consumir bytes recebidos, use a lógica apropriada de leitura da entrada.

Quando flush() termina, isso significa que o outro dispositivo recebeu a mensagem? Não. Significa que a transmissão pela interface serial local foi concluída; não confirma que o dispositivo remoto recebeu, analisou ou processou os dados. Use uma confirmação para verificar isso.

Quando devo chamar a função? Chame Serial.flush() quando o código seguinte precisar aguardar o fim da transmissão dos dados pendentes, por exemplo, antes de mudar um transceptor half-duplex para o modo de recepção. Em geral, não é necessário aguardar explicitamente após cada linha de log.

O PySerial usa o mesmo nome de método? O PySerial oferece ser.flush() no objeto de conexão serial. O método tem uma finalidade semelhante para dados de saída, mas é uma API separada de Serial.flush() do Arduino.