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!!

Exibições: 1040

Responder esta

Respostas a este tópico

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.

https://youtu.be/MzJ-Bni98oo

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 

feito, veja se esta ok as configs!

Vazia, sem nenhum peso!

Agora com 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

Quero desnvolver um programa Arduino para receber 8 bytes mais um carriage return

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 serial for 0x40, este será o primeiro byte do array

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 !!! 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço