UART - Linux embarcado [RESOLVIDO]

1. UART - Linux embarcado [RESOLVIDO]

Isac Marques da Silva
isacmarques

(usa Debian)

Enviado em 09/02/2015 - 08:21h

Bom dia.

Galera preciso da Ajuda de vocês mais uma vez. não sei se neste forum algum dos colegas trabalham com computação embarcada eu estou iniciando nessa area e estou com uma duvida. Eu utilizo a UART da beaglebone black para Transmitir os dados em uma rede RS485, para enviar esses dados utilizo a função WRITE da biblioteca termios.h só que esta acontecendo um problema. Eu envio e recebo os dados normalmente ou seja a comunicação esta ocorrendo no entanto a função Write esta com um delay segurando o envio dos dados por 10 ms assim as informações que eram para ser recebidas não chegam até a uart. No outro ponto da rede eu uso um processador MSP para receber os dados fiz uma gambiarra dando um delay no processador para aguardar o tempo da função write no entando terei que atualizar todas as placas que estão em produção.

Observe a imagem abaixo
https://www.dropbox.com/s/b9fkl6xagznght9/WP_20150209_08_06_35_Pro.jpg?dl=0

O grafico em amarelo representa a rs485 com canal aberto para transmissão de dados o grafico em azul é a transmissão de dados, os dados terminão de ser transmitidos mas a write continua ativa segurando ativo o canal de envio. Assim a MSP responde normalmente mas como o canal de recebimento da beaglebone não esta ativa estas informações se perdem na rede. A programação esta da seguinte forma:

POUT(49,1); // ativa a RS485 para transmissão dos dados
write(pt2,enviadadosgrav2,8); // Função enviando um vetor de 8 posições para a rede
POUT(49,0); //Desativa a transmissão habilitando a recepção dos dados


Galera quem puder me ajudar serei grato. Desde já muito obrigado a todos do VOL.







  


2. Re: UART - Linux embarcado [RESOLVIDO]

Antonio Thomacelli
tonnytg

(usa Outra)

Enviado em 09/02/2015 - 09:08h

Da uma olhada na documentação da própria lib termios.h
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/termios.h.html

De acordo com eles tem como você alterar o tempo de delay, verifica se isso te ajuda,
acredito que alterando o valor padrão do "CRDLY" seja o suficiente.

Att. Antonio Thomacelli Gomes
http://www.tonnytg.com.br


3. Re: UART - Linux embarcado [RESOLVIDO]

Isac Marques da Silva
isacmarques

(usa Debian)

Enviado em 09/02/2015 - 13:06h



Boa tarde
Obrigado Tonytg mas não deu certo tentei em todos os Delays e não funcionou. Estou dando uma olhada ainda aumentei o Delay diminui e não deu alterações, Aparentemente a função Write segura o programa e não deixa chamar a função que desabilita o canal de envio de informações to dando uma vasculhada se tiver algo mais que possa me ajudar serei grato.


Desde já muito obrigo pela atenção.


4. Re: UART - Linux embarcado

Paulo
paulo1205

(usa Ubuntu)

Enviado em 11/02/2015 - 11:01h

Prezado,

A chamada write() não é parte da termios, mas sim uma chamada genérica do mundo UNIX para todas as operações que queiram enviar dados para um dispositivo qualquer (incluindo disco, rede etc.).

Você está escrevendo um driver para implementar RS-485 na BB, ou está usando um driver já pronto apenas para implementar um protocolo de comunicação? Pergunto isso porque, se já existir um driver pronto, eu esperaria que você não tivesse de usar output nos pinos diretamente, mas sim que fizesse tudo através do descritor de arquivo, de um modo parecido com o seguinte.

int serial_fd;
struct serial_rs485 serial_params;
int rc;

fd=open("/dev/some_device", O_RDWR);
if(fd==-1){
perror("cannot open serial device");
exit(1);
}

/* XXX: Não sei se o próximo bloco é necessário. */
rc=ioctl(fd, TIOCGRS485, &serial_params);
if(rc==-1){
perror("cannot get rs485 params");
close(fd);
exit(1);
}

/*
Faz ajustes nos parâmetros da estrutura serial_params,
talvez usando os valores lidos acima como base. Entre
os parâmetros ajustáveis estão modos de sinalização e
temporização.
*/

/* Grava os parâmetros ajustados. */
rc=ioctl(fd, TIOCSRS485, &serial_params);
if(rc==-1){
perror("cannot set rs485 mode and params");
close(fd);
exit(1);
}

/*
Agora, teoricamente ao menos, você pode simplesmente
usar read() para receber dados e write() para enviar dados:
cabe ao driver de baixo nível, ativado nos blocos acima,
colocar o dispositivo nos modos devidos para realizar as
operações solicitadas.
*/

/* Quando a comunicação chegar ao fim... */
close(fd);



5. Re: UART - Linux embarcado

Isac Marques da Silva
isacmarques

(usa Debian)

Enviado em 11/02/2015 - 12:01h


Olá.

Tenho um max485 ligado direto nas entradas UART RX e TX e nos pinos da Beaglebone assim estou implementando uma função que vai mandar dados por meio deste max485 . Só que esta travando ele manda as informações a primeira vez e depois para no read. Alem de dar o problema descrito no primeiro post.


Nesse exemplo que vc me passou vou precisar de alguma biblioteca especifica para rs485?Acredito que do jeito que estou fazendo não de para utiliza-la mas como sou leigo pode ter uma forma mais facil ou até mesmo essa que você disse.

Obrigado pela ajuda.


6. Re: UART - Linux embarcado [RESOLVIDO]

Isac Marques da Silva
isacmarques

(usa Debian)

Enviado em 12/02/2015 - 16:47h

Boa tarde,

Pessoal consegui resolver o problema. O mesmo estava na inicialização da UART no Sistema Operacional coloquei as duas linhas abaixo no rc.local da pasta init.d e tudo funcionou corretamente.




echo BB-UART1 > /sys/devices/bone_capemgr.9/slots
echo BB-UART2 > /sys/devices/bone_capemgr.9/slots


Nunca imaginava que seria esse o problema do delay, para mim ele não iria nem funcionar, mas corrigi esse detalhe e tudo funcionou corretamente.

Obrigado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts