Artigo: Problema de utilização de Software Serial junto com Hardware Serial no Arduino

Neste artigo, vamos mostrar um problema encontrado ao utilizar a Hardware Serial do Arduino (porta 0 e 1) com o Software Serial.

Como o microcontrolador Atmega328P é um microcontrolador que executa uma tarefa por vez. A Software Serial pode perder dados na comunicação. É necessário um atraso para que isto não aconteça. Vamos pegar um exemplo disponível na própria IDE do Arduino:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(4, 5);

void setup()
{
Serial.begin(9600);
Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
}

void loop() // run over and over
{
if (mySerial.available())
{
Serial.write(mySerial.read());
}

if (Serial.available()){
mySerial.write(Serial.read());

}
}

Conectando um dispositivo Serial com eco nas portas 4 e 5, fazendo o UPLOAD da programação acima e abrindo o Serial Monitor como a figura abaixo:

Como exemplo foi utilizado o WifiShield. Ao mandar um caractere ao dispositivo, este envia de volta o mesmo caractere como eco. Podemos ver que o eco se perde e aparece um caractere diferente. Para resolver isso, vamos colocar um delay de 1ms no segundo "if" como está destacado em vermelho. Ficando da seguinte forma:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(4, 5);

void setup()
{
Serial.begin(9600);
Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
//mySerial.println("Hello, world?");
}

void loop() // run over and over
{
if (mySerial.available())
{
Serial.write(mySerial.read());
}

if (Serial.available()){
mySerial.write(Serial.read());
delay(1);
}
}

Podemos ver que o eco do dispositivo não se perde, como mostra a figura abaixo:

Então, caso esteja recebendo caracteres diferentes daquele que você deveria receber, experimente colocar um delay de 1ms. Pode resolver seu problema!

E é isso! Esperamos que tenha gostado! Para dúvidas sobre o artigo, poste aqui mesmo neste blog! Caso tenha sugestões para tutoriais, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui, respectivamente! Até a próxima!

Referências:

http://arduino.cc/en/Reference/Serial

Exibições: 6712

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Joarley Rodrigues da Silva em 18 abril 2016 às 16:51

Já que o SoftwareSerial usa porta digital para comunicação com outro hardware, pq eu não consigo que o código flua sem estar com o Arduino conectado na USB?

Eu não quero precisar usar ele conectado na USB, apenas se comunicar com um módulo de câmera.

No código eu uso: 

SoftwareSerial CamSerial(5,6);
...
while(CamSerial.available()>0) {

Esse while me força mesmo utilizar o Serial principal do Arduino? Não estou entendendo isso..

Comentário de Alex Giuliano Martins em 3 agosto 2012 às 9:04

Ôpa!
Esse problema acontece com o UNO ou Doemilanove? Ou com os dois?
Vi que um deles tem problema de comunicação serial...

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço