O que é o Serial.begin (9600)?

22

Eu sei que isso é para inicializar algo:

Serial.begin(9600);

Mas eu quero saber o que realmente significa?

shajib0o
fonte
3
A documentação possui uma boa descrição. arduino.cc/en/Serial/begin
sachleen

Respostas:

22

Serial.begin(9600)na verdade, não imprime nada. Para isso, você gostaria de usar Serial.print("Hello world!")para imprimir o texto "Olá, mundo!" para o console serial. Em vez disso, inicializa a conexão serial em 9600 bits por segundo.

Ambos os lados da conexão serial (ou seja, o Arduino e o seu computador) precisam ser configurados para usar a mesma conexão serial rápida para obter qualquer tipo de dados inteligíveis. Se houver uma incompatibilidade entre o que os dois sistemas pensam que a velocidade é, os dados serão distorcidos.

9600 bits por segundo é o padrão para o Arduino e é perfeitamente adequado para a maioria dos usuários, mas você pode alterá-lo para outras velocidades: Serial.begin(57600)configuraria o Arduino para transmitir em 57600 bits por segundo. Você precisaria definir o software que estiver usando no computador (como o monitor serial do Arduino IDE) na mesma velocidade para ver os dados sendo enviados.

heypete
fonte
2
Baud e BPS são duas coisas diferentes ... não consigo encontrar o link que estava procurando agora.
Anonymous Penguin
e se eu colocar "Serial.begin (0);" ou "Serial.begin (4000);". Quero dizer, quero saber qual é a diferença entre os números?
Shajib0o
3
Serial.begin é usado para definir a velocidade da comunicação, em bits por segundo. Um byte é igual a 8 bits, mas as conexões seriais enviam um bit de início e parada para identificar o início e o final de um byte específico para o sistema receptor. Assim, são necessários 10 bits para enviar um caractere. O uso Serial.begin(0)informa ao Arduino que ele deve se comunicar com o serial a 0 bits por segundo. Como você pode esperar, isso significa que o Arduino nunca enviará nenhum dado. Serial.begin(4000)fará com que o Arduino envie dados a 4000 bits por segundo. Isso não é padrão, mas é bom.
heypete
2
Resumindo: alterar o número altera a velocidade. Ao diminuir o número (por exemplo Serial.begin(300)), o Arduino envia os dados mais lentamente. Aumentando, digamos que o 57600 envie dados mais rapidamente. Tanto o sistema de envio como o sistema de recebimento precisam concordar com a velocidade a ser usada: o programa serial do seu computador, como a janela do Arduino Serial Monitor, permite definir a velocidade com a qual o computador receberá dados, mas você só pode selecionar dentre as opções comuns. velocidades: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 e 11520 bit / s. Você não pode inserir outras velocidades, como 4000. 9600 geralmente é bom.
heypete
Baud and BPS are two different things... can't find the link I was looking for now.- Aqui está uma explicação: Apêndice C: "baud" vs. "bps"
Nick Gammon
21

Uma imagem vale mais que 1000 palavras, por assim dizer, (1024 palavras se você trabalha com computadores), então vou postar algumas fotos ...

Configurei meu Uno para enviar "Fab" a 9600 baud e capturei os resultados em um analisador lógico.

Comunicação serial - 3 letras

As partes sombreadas em vermelho são o período "ocioso" entre os bytes.

Pelo gráfico acima, observe que a linha de dados Tx (transmissão) normalmente é alta (1) até cair baixa para indicar o início de um caractere (byte). Este é o bit inicial . Em seguida, os 8 bits de dados (indicados por pontos brancos) aparecem na taxa de transmissão (9600 amostras por segundo). Depois disso, a linha é elevada novamente. Este é o bit de parada (a parte vermelha). Então vemos o bit inicial para o próximo personagem, e assim por diante. A parte "stop" pode ser indefinidamente longa, porém deve ter pelo menos um bit de comprimento.


Mais detalhes para o primeiro caractere (a letra "F" ou 0x46 ou 0b01000110) podem ser vistos aqui:

Comunicação serial - um único byte

  • A - sem dados (Tx é alto)

  • B - O "bit inicial". A linha é baixada para informar ao destinatário que um caractere (byte) está começando a ser enviado. O receptor aguarda um relógio e meio antes de amostrar a linha.

  • C - Primeiro caractere chega (a letra "F" ou 0x46 ou 0b01000110). Como não há bit de relógio, os dados recebidos são simplesmente amostrados na taxa de transmissão (transmissão). Ao contrário da comunicação SPI, os dados chegam primeiro com o bit menos significativo (caso você não esteja enviando 8 bits por byte). Assim, vemos 01100010 (em vez de 01000110).

  • D - O bit de parada. Isso é sempre alto, para garantir que possamos distinguir entre o final deste byte e o início do próximo. Como o bit inicial é um zero e o bit de parada é um, sempre há uma transição clara de um byte para o próximo.

  • E - O bit inicial para o próximo caractere.


Você pode ver na captura do analisador lógico que T1 - T2é 0,1041667 ms e, por acaso, é 1/9600:

1 / 9600 = 0.00010416666 seconds

Assim, a taxa de 9600 fornece o número de bits por segundo e o inverso é o intervalo de tempo entre os bits .


Outras considerações

  • As comunicações seriais não têm relógio automático (diferentemente do SPI ou I2C e outros), portanto, o remetente e o destinatário precisam concordar com a taxa de clock.

  • A taxa de clock não é exata no Arduino, porque o hardware precisa dividir o relógio do sistema para obter um relógio serial, e a divisão nem sempre é exata. Quase sempre há um erro, o valor é dado na folha de dados (números citados para um relógio do sistema de 16 MHz, como no Uno):

    Erro de taxa de transmissão serial

  • Você pode variar o número de bits de dados, não precisa enviar 8 deles, na verdade, pode enviar de 5 a 9 bits.

  • Opcionalmente, pode haver um bit de paridade enviado após os bits de dados.

    • Se você especificar a paridade "ímpar", o bit de paridade será definido de forma que o número total de 1 bits seja ímpar.
    • Se você especificar a paridade "par", o bit de paridade será definido de maneira que o número total de 1 bits seja par.
    • Se você não especificar nenhuma paridade, o bit de paridade será omitido.

    Isso pode ajudar o receptor a detectar se os dados chegaram corretamente ou não.

  • O bit de paridade é enviado antes do bit de parada.

  • No caso de 9 bits de dados (conforme usado no protocolo SeaTalk), o bit de paridade é redefinido como um nono bit de dados. Portanto, você não pode ter 9 bits de dados e um bit de paridade.

  • Você também pode ter dois bits de parada. Isso basicamente apenas aumenta o tempo entre bytes. Nos "velhos tempos", isso era para que equipamentos eletromecânicos lentos pudessem processar o byte anterior (por exemplo, para imprimi-lo).


Possível corrupção

Se você começar a ouvir dados seriais no meio de um fluxo, é bem possível que um bit 0 no meio do fluxo seja interpretado como um bit inicial e, em seguida, o receptor interpretará tudo após isso incorretamente.

A única maneira real de se recuperar disso é ter uma lacuna grande o suficiente, de tempos em tempos (por exemplo, 10 bits) para que isso não possa acontecer.


Lógica invertida

Os bits mostrados aqui (no nível lógico) não são invertidos. Ou seja, um bit é ALTO e um bit é BAIXO. Se você possui um equipamento RS232, provavelmente enviará algo como -12 V por 1 bit e +12 V por 0 bits. Isso é invertido porque um é menor que zero, em termos de tensão.

Se você tiver esses dispositivos, precisará fazer a conversão de tensão e a inversão lógica. Chips como o MAX232 farão as duas coisas por você. Eles também podem fornecer -12 V necessários para acionar esse equipamento, gerando-o internamente com a ajuda de alguns capacitores fornecidos pelo usuário.


Regra geral da velocidade

Como, com um bit inicial, 8 bits de dados e um bit de parada, temos um total de 10 bits, como regra geral rápida, você pode calcular o número de bytes que pode transmitir em um segundo dividindo a taxa de bits por 10 .

Por exemplo. Em 9600 BPS, você pode enviar 960 bytes por segundo.


Código a reproduzir:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }
Nick Gammon
fonte
1

TLDR; Inicializa a porta de comunicação serial e define a taxa de transmissão. O dispositivo com o qual você está se comunicando (ou o Arduino IDE Serial Monitor) deve ser definido com uma taxa de transmissão correspondente. Depois de inicializar a porta, você pode começar a enviar ou receber caracteres. Referência serial do Arduino

linhartr22
fonte
Não diminuir ou desrespeitar a excelente cobertura de @ Nick-Gammon sobre este tópico.
Linhartr22