Jump to content
Fórum Script Brasil
  • 0

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


Dilson_boy

Question

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 to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...