Boa tarde pessoal, alguém ja trabalhou com este conversor rs232?
To tentando receber os dados da porta RS232 de de uma balança para o ESP8266, porem não me da retorno nenhum.
To tentando utilizar os exemplos da SoftwareSerial Library, e nada!!
Tags:
Muito fácil - a balança fica enviando os valores dos pesos na porta serial.
Favor informar o parâmetro configurado na balança :
Parâmetro 4.4.L.P.S: Indica a velocidade de leitura por segundo.
5) Leituras por Segundo (4.4LPS)
Permite deixar mais dinâmica a leitura do indicador de pesagem. Aumenta o número de leituras por segundo da célula de carga da balança, ou seja, obtém-se pesagens mais rápidas. A partir do parâmetro 4.4 LPS. Pressionar a tecla T ou a tecla I para escolher o valor de Leituras por Segundo. Para aceitar o valor configurado pressionar Z. E possível configurar a leitura do valor 1 mínimo até 12 máxima leitura. Para acessar este parâmetro deve pressionar a tecla L depois o T, e navegar com a tecla Z até a opção 4.4 LPS.
Envie o programa ARDUINO que esta usando atualmente.
Velocidade de leitura esta em 8
O arquivo e este o próprio da SoftwareSerial SoftwareSerialExample.ino
Como você esta usando um módulo RS232 (Muita atenção) :
The circuit:
* RX is digital pin 10 (connect to RX do Modulo RS232)
* TX is digital pin 11 (connect to TX do Módulo RS232)
Alimentação do módulo RS232 = 5V
mySerial.begin(9600); // Configuração da SW Serial = 9600 Bps OK
mySerial.println("Hello, world?"); (Deleta isso, você não pode enviar nenhuma mensagem para a balança)
Onde está a configuração da porta Serial - Console Arduino? Acho que deve usar isso também.
Serial.begin(9600);
Apaga isso - você não deve enviar dados para a SW serial :
if (Serial.available()) {
mySerial.write(Serial.read());
Aqui você esta lendo a SW Serial e enviando a leitura para a sua console Arduino.
As leituras da balança são enviadas no formato ASCII.
Mostre o print da Console Arduino. Não sei se os dados são enviados no formato ASCII.
Talvez tenha que converter Byte em Char.
if (mySerial.available()) {
Serial.write(mySerial.read());
Estude isso:
https://docs.arduino.cc/learn/built-in-libraries/software-serial
https://www.arduino.cc/reference/en/language/functions/communicatio...
Dei uma enxugada no código e vou colocar ele aqui = SoftwareSerialLimpa.ino
Segue também um vídeo dos testes feitos agora.
Faça mais um teste.
Com a balança conectada no seu PC, use o Realterm.
Na configuração Display as = HEX SPACE
Envie os prints.
1) com Balança vazia
2) com Peso 1,5Kg
Veja que os dados recebidos terminam com o carriage return = 0x0D
Mas no inicio, não começam com @ (0x40)!
0x46 = F balança em zero estável
0x44 = D peso bruto estabilizado
Com balança vazia (em Hexa)
46 30 30 30 2E 30 30 30 0D = 000.000 CR
Com 1,5Kg (em Hexa)
44 30 30 31 2E 35 30 30 0D = 001.500 CR
@001.500CR CR= carriage return
Transformando em HEXA = 0x40 0x30 0x30 0x31 0x2E 0x35 0x30 0x00 0x0D
Isto é 8 bytes mais o CR (carriage return)
No seu programa esta recebendo um byte de cada vez.
Acho que vai ter que montar um array (string) .
Se o byte for 0x40, este será o primeiro byte
os outros bytes preencherão o array de 8 bytes
se o byte for 0x0D, finalizou o array.
Depois imprime o array.
Sabe programar isso?
Usando o ChatGPT - Inteligência artificial - Muito legal
https://openai.com/blog/chatgpt
Para desenvolver um programa Arduino capaz de receber 8 bytes mais um carriage return, você precisará seguir os seguintes passos:
Leia o PDF em anexoReceber%208%20bytes%20Arduino.pdf
Se o byte lido da porta serial for 0x40 e você desejar que este seja o primeiro byte do array, você pode incluir uma verificação no loop for que lê os bytes da porta serial. Se o primeiro byte lido for igual a 0x40, você pode atribuir esse valor à primeira posição do array "dados", caso contrário, o primeiro byte lido será armazenado na segunda posição do array.
O seu programa completo, com a modificação para armazenar o valor 0x40 na primeira posição do array caso este seja o primeiro byte recebido, ficaria assim:
Note que, com essa modificação, se o primeiro byte recebido for diferente de 0x40, ele será armazenado na segunda posição do array e o primeiro byte será 0x00. Além disso, é importante lembrar que, para que esse código funcione corretamente, os 8 bytes recebidos devem estar em ordem e sem interrupções.
-------------------------------------------
Naõ esta tudo correto, mas ajuda não é ?
Mas o array somente poderá preenchido se o primeiro byte recebido for 0x40. Este será o primeiro do array. E para verificar que o array esta completo, o ultimo byte deverá ser o carriage return
Certo, se o array só pode ser preenchido se o primeiro byte recebido for 0x40, você pode usar uma variável booleana para controlar isso. A variável pode ser inicializada como "false" e alterada para "true" se o primeiro byte recebido for 0x40. Além disso, você pode incluir uma verificação para garantir que o último byte recebido seja o caractere de retorno de carro (carriage return).
Com essas modificações, o seu código ficaria assim:
Muito foda! KKKK
Nesse código, a variável "primeiro_byte_recebido" é inicializada como false no início do programa. O loop while verifica continuamente se há dados disponíveis na porta serial. Se o primeiro byte recebido for 0x40 e "primeiro_byte_recebido" ainda for false, ele será atribuído à primeira posição do array "dados" e "primeiro_byte_recebido" será alterado para true. Em seguida, todos os bytes seguintes recebidos serão atribuídos às posições subsequentes do array "dados", desde que "primeiro_byte_recebido" seja true.
A verificação para garantir que o último byte recebido seja o caractere de retorno de carro (carriage return) é feita no loop while interno. Quando o último byte é recebido e armazenado na oitava posição do array "dados", a verificação é realizada. Se o último byte for igual a '\r', o array está completo e os dados podem ser processados no local indicado pelo comentário.
Note que essa implementação pressupõe que todos os 8 bytes serão recebidos de uma só vez, em ordem e sem interrupções, e que o último byte recebido será sempre o caractere de retorno de carro (carriage return). Se essa suposição não for válida para o seu caso de uso, você precisará ajustar o código de acordo.
Na verdade o conjunto de caracteres recebidos será de 8 bytes mais um carriage return no final. O primeiro byte terá que ser 0x40.
Entendi, obrigado por esclarecer. Com base nessa informação, você pode modificar o código que eu forneceu anteriormente para garantir que o conjunto de caracteres recebidos tenha o tamanho correto (8 bytes) e que o primeiro byte seja 0x40.
Além disso, você pode incluir uma verificação para garantir que o último byte recebido seja o caractere de retorno de carro (carriage return).
Nesse código, o loop while externo verifica continuamente se há dados disponíveis na porta serial. Se o primeiro byte recebido for 0x40, o preenchimento do array "dados" será iniciado. O primeiro byte será atribuído à primeira posição do array, e os 7 bytes seguintes serão lidos e armazenados nas posições subsequentes do array por meio de um loop for.
Após o preenchimento do array, o loop while interno aguarda a chegada do último byte, que deve ser o caractere de retorno de carro (carriage return). Se o último byte recebido for igual a '\r', o array está completo e os dados podem ser processados no local indicado pelo comentário.
Note que essa implementação pressupõe que todos os 8 bytes serão recebidos de uma só vez, em ordem e sem interrupções, e que o último byte recebido será sempre o caractere de retorno de carro (carriage return). Se essa suposição não for válida para o seu caso de uso, você precisará ajustar o código de acordo.
Incrível !!!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2023 Criado por Marcelo Rodrigues.
Ativado por