Ir para conteúdo
Fórum Script Brasil
  • 0

Aquisição de dados udp e escrever um arquivo wav


Dilson_boy

Pergunta

Ola pessoal estou com um problemão no meu tcc rsrs.

Estou fazendo aquisição de amostras de um módulo arduino que se comunica através de uma interface udp com níveis de quantização de 0 a 1023.

Estou armazenando esta aquisição na variável $watts.

O problema consiste em gerar um arquivo wav com várias amostras dentro dele, com este programa que eu fiz, ele está armazenando apenas 1 valor na variável $watts.

Quando eu gero um loop na variável ele pega o valor e mostra 8000 vezes!

Alguém tem uma idéia de como eu poderia armazenar várias amostras que chegado da UDP em uma variável?

Ou alguma forma de fazer aquisição destes dados?

Segue o programa:

#!/usr/bin/perl -w

# cclisten - UDP Currentcost listener

use strict;

use IO::Socket;

my($msglen,$sock, $newmsg, $MAXLEN, $PORTNO);

my($lasttimestamp,$timestamp,$tempr,$watts,$errcount,$timeouts);

$MAXLEN = 1024;

$PORTNO = 52240;

$sock = IO::Socket::INET->new(LocalPort => $PORTNO,

Proto => 'udp',

LocalAddr => '192.168.10.255',

Broadcast => 1)

or die "socket: $@";

print "Awaiting UDP messages on port $PORTNO\n";

$lasttimestamp = 0;

while ($sock->recv($newmsg, $MAXLEN)) {

$msglen = length($newmsg);

$timestamp = unpack("L", substr( $newmsg, 0, 4));

$tempr = unpack("S", substr( $newmsg, 4, 2)) / 10;

$watts = unpack("S", substr( $newmsg, 6, 2));

#print "tempo: $tempr Obtendo dados: $watts\n";

use Audio::Wav;

my $wav = new Audio::Wav;

my $sample_rate = 44100;

my $bits_sample = 10;

my $details = {

'bits_sample' => $bits_sample,

'sample_rate' => $sample_rate,

'channels' => 1,

# if you'd like this module not to use a write cache, uncomment the next line

#'no_cache' => 1,

};

my $write = $wav -> write( 'testesom.wav', $details );

my $i;

for $i (44..8000){

print "$watts\n";

$write -> write($watts);

}

$write -> finish();

die "recv: $!";

}

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Hi.

Não tenho como fazer o teste pra te ajudar melhor, mas vamos lá...

Você faz o unpack e joga isso pra escalar $watts, certo?

=> perldoc - unpack()

unpack does the reverse of pack: it takes a string and expands it out into a list of values. (In scalar context, it returns merely the first value produced.)

Tenta jogar o valor do unpack pra um array e depois joga pra uma scalar.

my @watts = unpack("S", substr( $newmsg, 6, 2));
$watts = join q(), @watts;

[]'s

Link para o comentário
Compartilhar em outros sites

  • 0

Aew cara consegui fazer dar certo!

É isso mesmo que você falou eu preciso gerar uma array e capturar as informações:

fiz isso da seguinte forma:

code:

my @watts;

my $i =0;

for ($i=0 , $i<=8000, $i++);{

if (sock-> recv($newmsg,$MAXLEN)) {

[$watts] [$i] = unpack("S", substr( $newmsg, 6, 2));

}

}

Valeu pela ajuda camarada!!

Dessa forma funfou!!

Link para o comentário
Compartilhar em outros sites

  • 0

E ae galerinha estou aqui de novo, com um problema um pouco diferente. Acredito que pra vocês programadores será fácil.

Eu gerei 4 programas que fazer a coleta de dados, o problema é que eles precisam executar o processo exatamente no mesmo instante!

Para isso eu gerei uma programação no crontab.

* * * * * * perl ./Ouvinte.pl

* * * * * * perl ./Estação1.pl

* * * * * * perl ./Estação2.pl

* * * * * * perl ./Estação3.pl

O problema é que a precisão de 1 minuto para mim é muito ruim! eu precisaria executar os 4 programas no mesmo segundo. Alguém teria alguma idéia de como fazê-lo?

Obrigado e abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Hmm... Hora de brincar com um pouco de assincronismo então.

Há diversos modos de se fazer isso, mas acho que forking é o mais simples.

Faremos um script que executará os outros simultaneamente. Lembrando que, por ser simultâneo, não há controle de qual executará primeiro. Todos serão disparados juntos!

#!/usr/bin/env perl

use strict;
use warnings;

my @childs = ();
my @files  = qw(Ouvinte.pl Estação1.pl Estação2.pl Estação3.pl);

for(@files) {
    my $pid = fork;
    if($pid) {
        push @childs, $pid;
    }
    elsif($pid == 0) {
        exec $^X . ' ' . $_;
        exit(0);
    }
    else {
        print "não foi possivel realizar a operacao: $!\n";
    }
}

for(@childs) {
    waitpid($_, 0);
}

Link para o comentário
Compartilhar em outros sites

  • 0

Opa ai sim funcionou! Valeu tu é o cara Fvox!

Bom agora surgiu um outro pequeno problema, nós estamos escrevendo um arquivo.txt com uma sequência numérica de uma array.

Ex .: @am1 = 12 20 35 50.

Até ai tranquilo.

Porém esta sequência deve ser recuperada em outro arquivo.

Ex.: open = my $fh , '<', 'ouvinte.txt';

my @a = <$fh>;

dai quando eu dou print no primeiro elemento:

print '$a[0]';

aparece

12 20 35 50

sendo que o pretendido seria

print '$a[0]';

aparecesse somente o primeiro elemento da array

12;

Preciso de cada elemento pois farei um tratamento matemático deles.

Grato!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...