Ir ao conteúdo

RS-232 ler decimal ou hex


RogerMasters

Posts recomendados

Postado

To com um dificuldade com um projeto .

Consegui fazer em VB para usar no PC mais agora gostaria de saber se é possível fazer como o pic.

No programa ele recebe pela a rs232 um seqüência de HEX tipo 41 54 49 38 0D 0A depois retransmite assim 0A 0D 38 49 54 41 ou seja inverte a ordem da seqüência.

Fazer o pic transmitir até consigo mais fazer o pic ler este HEX ou decimal pela a rs232 que não faço a mínima ideia o danado só aceita ASCII

To tentando fazer em C usando CCS C

Obrigado

Postado

No programa ele recebe pela a rs232 um seqüência de HEX tipo 41 54 49 38 0D 0A depois retransmite assim 0A 0D 38 49 54 41 ou seja inverte a ordem da seqüência.

Você esta olhando para transmissão real da porta serial que sempre é em HEX.

Idealmente se assume transmissão de caracteres/valores em ASCII.

Fazer o pic transmitir até consigo mais fazer o pic ler este HEX ou decimal pela a rs232 que não faço a mínima ideia o danado só aceita ASCII

To tentando fazer em C usando CCS C

Obrigado

Qual é a duvida. Come se recebe pela entrada serial do PIC ou codificação em ASCII ?

Postado

Minha duvida é como pegar estes HeX e colocar em uma variavel CHAR(X) dentro do PIC na hora que ele recebe pela a porta e depois retransmitir ( já sei como transmitir), não precisa ser exatamente em HEX pode ser decimal tipos assim:

Char hex = 41 54 49 38 0D 0A

Nao sei se o PIC faz isto. está é a maior duvida!

Postado

Vou tentar explicar, o PIC recebe qualquer valor HEX pela entrada serial EX:

41 54 49 38 0D 0A ( o final "0D 0A" isso é um "pula Linha", talvez você não precise)

Esta recebendo valores ASCII em HEX, também poderia receber 0x01 0x03 0x02 .....

Para enviar pela saída serial é mais complicado. O compilador pode usar o mesmo comando do display que é ASCII, se você colocar 1 vai ser enviado "1" em ASCII (0x31 em HEX).

não precisa ser exatamente em HEX pode ser decimal tipos assim:

Char hex = 41 54 49 38 0D 0A

Esse codico ou string esta em HEX, caso enviasse em decimal daria outros valores em ASCII.

Não é possível enviar em decimal, somente em ASCII ou diretamente em HEX (caso o compilador permita). Acredito que seu problema seja de numeração.

Por exemplo:

Recebendo pela porta "1" em ASCII (que na verdade vale 49 em decimal)

num = serialIn - 48; // 48 é 0 em ASCII, portanto 49 - 48 = 1 decimal

Para envio o compilador transforma as variáveis decimal em ASCII automaticamente.

serialOut (num) // a variável num esta em decimal, por exemplo se for 1 vai enviar "1" em ASCII que vale 31 em HEX

Postado
Minha duvida é como pegar estes HeX e colocar em uma variavel CHAR(X)

no mometo que o numero for escrito os bit's correspondentes das entradas que estão lendo assumirão o valor das entradas então é so fazer assim

CHAR X;

char x=port(porta ou portb ou portc etc vai depender da porta que a leitura estver sendo feita)

qualquer pergunta é so falar

Postado

Usei :

#int_rda

void rd_isr(void)

Como vou usar para receber um numero limitado esta funçao será ideal!

Consegui aqui pessoal, valeu pela as dicas, mais o que move o mundo são as perguntas...

Como vou trabalhar com rs-232 e com o pic 16f877 , ele pode ser ligado direto na DB9 ou tenho que usar um MAX 232?, Caso não existe algum PIC que não tenha a necessidade do MAX!

Postado

RogerMasters,

cara tu necessita do MAX para converter os sinais ttl do microcontrolador para os sinais elétricos comuns ao protocolo rs 232 ...

só por desencargo de consciência, visitei o datasheet deste PIC e não achei nada de especial relacionado ao rs 232.

portanto, é necessário um conversor max 232.

Postado

beleza , mais realizei alguns testes aqui , e o aparelho que vou connectar trabalha com 115200 baud rate ai melou tudo voltei para o 0. :angry:

O pior eo que o Protheus nao emula a COM dele mais que 57600...

Uma pergunta ... posso fazer o projeto a 9600 para testar e depois mudar para 115600 na protoboard? uso o 232Analyzer!

Postado
beleza , mais realizei alguns testes aqui , e o aparelho que vou connectar trabalha com 115200 baud rate ai melou tudo voltei para o 0. :angry:

Esse aparelho é o que? O PC?

Pode simular uma taxa mais baixa, uma taxa alta como citada acima ocorre muito erro dependendo da distancia.

Postado
o aparelho que vou connectar trabalha com 115200 baud rate

Nessa velocidade o padrão 232 precisa de um belo cabo e que não seja muito longo, mesmo assim não é garantido que a comunicação ocorra bem!

Se tiver mesmo que trabalhar nessa velocidade e de precisão nos dados, aconselho que incremente no seu códido uma rotina de CRC-16 (Cyclic Redundancy Check).

Usado em sistemas síncronos que utilizam caracteres de 8 bits.

Detecta erros:

Todos simples

Todos duplos

Todos com número ímpar de bits

Todas rajadas de comprimento <= 16

99.997% das rajadas de comprimento 17

99.998% das rajadas >= 18 bits

RS-232 ler decimal ou hex

rs-232 lê e envia byte, quem faz a conversão para hex ou ascii é o compilador que está usando

Postado

rafael.luc É um aparelho de decoder de TV via satélite para um dongle.

A pcb do projeto pode ficar dentro deste recptor praticamente a distancia 0.

Infelizmente este rate é usado! Vou tentar melhora o Maximo, o que o projeto faz:

O Recptor manda 9 Hex para o dongle exemplo:

08 06 0B 54 2E 64 00 37 2C

o pic tem que inverter a ordem

2C 37 00 64 2E 54 0B 06 08

receptor<--------->dongle (RS-232)

2 <------------------> 3

3 <-------[pic]------ > 2

5 <------------------> 5

O receptor não fica mandando os Hex toda hora e sim toda vez que troca de canal

O programa:

#include <16f877.h> // identifica microcontrolador alvo

#device ADC=10 // define AD para 10 bits, variando de 0 a 1023

#use delay (clock=4000000) // <- define cristal para 4Mhz.

//#use delay (clock=4000000) //

#define C0 pin_c0

#define C6 pin_c6

#define C7 pin_c7

#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7 ,STREAM = COM_B)

//28800

//56000

//115200

int x=0;

int HexTXP1= 0;

int HexTXP2= 0;

int HexTXP3= 0;

int HexTXP4= 0;

int HexTXP5= 0;

int HexTXP6= 0;

int HexTXP7= 0;

int HexTXP8= 0;

int HexTXP9= 0;

unsigned int8 data;

//----------------------------------------------------------------------------//

// serial tx routine //

//----------------------------------------------------------------------------//

void Trasmit()

{

fputc(HexTXP9, COM_B);

fputc(HexTXP8, COM_B);

fputc(HexTXP7, COM_B);

fputc(HexTXP6, COM_B);

fputc(HexTXP5, COM_B);

fputc(HexTXP4, COM_B);

fputc(HexTXP3, COM_B);

fputc(HexTXP2, COM_B);

fputc(HexTXP1, COM_B);

}

//----------------------------------------------------------------------------//

// serial receive interrupt routine //

//----------------------------------------------------------------------------//

#int_rda

void rd_isr(void)

{

disable_interrupts(INT_RDA); // Disable Serial Recieve Interrupt

disable_interrupts(GLOBAL); // Disable Global Interrupts

data= fgetc(COM_B);

// fputc(data, COM_B);

x = x +1;

if(x == 1)

{

HexTXP1 = data;

}

if(x == 2)

{

HexTXP2 = data;

}

if(x == 3)

{

HexTXP3 = data;

}

if(x == 4)

{

HexTXP4 = data;

}

if(x == 5)

{

HexTXP5 = data;

}

if(x == 6)

{

HexTXP6 = data;

}

if(x == 7)

{

HexTXP7 = data;

}

if(x == 8)

{

HexTXP8 = data;

}

if(x == 9)

{

HexTXP9 = data;

Trasmit();

x = 0;

}

enable_interrupts(GLOBAL);

enable_interrupts(INT_RDA);

}

//*********************************************************************

//**********************************************************************

void main()

{

enable_interrupts(int_rda);

enable_interrupts(global);

for(;;)

{

output_high(C0); // ativa C0

delay_ms(150); // tempo de 500 ms

output_low(C0); // desativa C0

delay_ms(150); // tempo de 500 ms

}

}

Lembrando que sou meio incidente em PICs mais ja manjo muito de VB, até tenho um versão do que eu quero fazer em um programa no PC usando a sua saída serial

Nao liguem muitos pelo o numeros de IFs :wub:

Postado


Variáveis
byte Buffer[8]; //vetor ou matriz. " o buffer tem o tamanho de 9 posições"
int i;
int j;

main:

Se (SerialIn > 0) faça

buffer[i] = SerialIn - 48; // adiciona cada byte lido na entrada serial em decimal
// incrementa valores lidos da entrada serial de forma crescente
i = i + 1;
Fim Se

Se (i == 8) faça
i = 0; // zera o contador
Vai Para subrotina Enviar:
Fim Se

Retorna Main:
Fim // (*) fim de uma instrução de clock

subrotina Enviar:

Para (j = 8; j <= 0, j--)
SerialOut ( buffer[j]); //envia para saída valores em forma decrescente
Fim do laco


Retorna Main:

(*) Se reparar não usei FOR na leitura da entrada serial, ao menos aqui no meu compilador preciso dar um ciclo completo de clock para esvaziar o buffer por isso o IF no lugar.

Tem que adaptar para seu compilador, qualquer duvida pergunte.

  • 2 semanas depois...
Postado

Bom estou tentando fazer com outro pics sem ser o 16F877A , tentei com 16F628a mais parece que estes pic não consegue uma USART decente como o exterior , alguém conhece outro pic mais barato que o 16F877 e que tenha as mesmas características , com menus pinos , ou seja mais econômico em tudo!

  • 1 ano depois...
Postado

Amigo você poderia me dizer se você conseguiu fazer este seu projeto se sim poderia me dar umas dicas e eu tambem posso ajudar,sei programar razoavelmente bem em c ,nao sei se entendi bem este seu topico fala de um dongle de receptor de satelite tipo estes azbox se sim me de umas dicas desde ja agradeco.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...