Página 1 de 1

Passando valores ascii

MensagemEnviado: 15 Out 2008 15:24
por MTC
Seguinte, montei uma interface com ADC e Pic, e recebo os dados via RS232 no linux, programado em C. Vou armazenando os dados na memoria e qdo saio do programa ai gravo em arquivo ascii.

To precisando conforme os dados vao sendo adquiridos ir mostrando eles em um grafico do tipo XY, e pra isso quero usar SW pronto, tipo gnuplot, xpplot ou xygraph, ou algum outro.

O probrema em questao é: como ir passando os dados conforme vao sendo coletados para o segundo programa. Alguns destes SWs tem a opcao de ler arquivo em intervalos para acompanhar o crescimento do mesmo, mas ai vem outro problema: tenho que ler cada valor, abrir o arquivo ascii e fechar ele, nisso perco tempo (a amostragem do dac eh de 1khz) e tive uns erros de acesso pelo arquivo estar sendo usado pela aquisicao de dados.

Tem alguma opcao de ir passando os valores lidos pra alguma variavel de ambiente do shell, tipo: ECHO $VARIAVEL ????


Alguem tem alguma ideia????

ps.: tem q usar um SW de grafico pronto, nada de perder tempo, pode ser xlib, gtk, perl.

[]1s

MensagemEnviado: 15 Out 2008 16:28
por joao
simples...

Use a linguagem de programaçào expect!
Com ela vc pode rodar um programa qualquer desses de gráfico e ficar lendo uma variavel local ou arquivo e passar para o programa como vc estivesse digitando no teclado o valor.

Existe também o perl expect que faz a mesma coisa, mas em perl. Eu aconselho a usar esta última, pois é bem mais simples de se usar e mais entendível o código. Além do que, a parte de leitura do arquivo é bem simples e vc pode fazer algo multithead com ele! Enquanto um carinha le, o outro escreve no programa.

Tente fazer um prog e dai se tiver dúvidas, fale comigo. Só não posso lhe dar um programa pronto porque estou meio sem tempo, mas acho que em menos de 2 dias vc termina isso.

[]'s

MensagemEnviado: 16 Out 2008 08:10
por MTC
Oi Joao, realmente eh bem interessante a ling expect, da pra automatizar um aporrada de coisas. No momento achei meio trabalhoso aprender perl pra tentar resolver.
Na minha aplicacao, to precisando fazer 2 progs em C se comunicarem unidirecionalmente. O problema principal é poder abrir e fechar para leitura/escrita um arquivo ascii sem sincronizacao entres os sws.

To vendo alguma coisa em Sockets para isso. Parece complicado, mas vou tentar implementar.

[ ]`s

MensagemEnviado: 16 Out 2008 10:28
por joao
Ola MTC,

Eu ainda recomendo perl para fazer isso...
Ao invés de sockets, vc pode usar memória compartilhada ou arquivos compartilhados, com pemrissão de leitura/escrita, o que significa que se alguém está lendo/escrevendo, o outro não pode escrever/ler.

Perl é muito facil de aprender!

Vc disse que o problema é a sincronização entre os dois sws, mas como vc fará para passar esses valores para o GNUPlot por exemplo? Só com expect da vida ou algo parecido...

De qualquer maneira, estude semáforos para resolver o seu problema de sinalização entre leitura e escrita. Porque o é com isso que vc resolve. Vc terá que ter memória compartilhada para fazer isso.

Em perl tem pronto... :roll:

Ok, ok, sei que to te pentenhando para usar perl, mas se vai fazer em C, tenta fazer ai e qualquer dúvida pergunta ai que tentamos achar mais sobre o assunto. Por sinal, vc pode usar o comando fork no seu programa para fazer esses "dois" programas que vc disse. Com o fork vc cria duas "threads" mas sendo o mesmo processo. E dai fica fácil trabalhar com memória compartilhada nele.

[]'s

MensagemEnviado: 16 Out 2008 11:35
por xultz
Sockets pod eparecer complicado, mas acredito que seja o caminho mais adequado para teu programa. Depois você pode até brincar de fazer os programas se conversarem via internet :)

MensagemEnviado: 16 Out 2008 12:35
por msamsoniuk
MTC escreveu:Oi Joao, realmente eh bem interessante a ling expect, da pra automatizar um aporrada de coisas. No momento achei meio trabalhoso aprender perl pra tentar resolver.
Na minha aplicacao, to precisando fazer 2 progs em C se comunicarem unidirecionalmente. O problema principal é poder abrir e fechar para leitura/escrita um arquivo ascii sem sincronizacao entres os sws.

To vendo alguma coisa em Sockets para isso. Parece complicado, mas vou tentar implementar.

[ ]`s


sockets eh simplao! basta vc ser um cara modular e usar o netcat:

nc -s -p 8000 | programa_destino &
programa_fonte | nc localhost -p 8000 &


se vc quiser, pode chamar de dentro mesmo com popen(), daih mantem stdin e stdout para outros fins.

outra opcao eh usar uma fifo:

mkfifo fofo
programa_destino < fofo &
programa_origen > fofo &

e fechou! se quiser chamar de dentro, usa fopen().