• 0
Sign in to follow this  
fabim

Novato Delphi.

Question

Ola a todos.

Bom pessoal, eu trabalho com pascal mais para microcontroladores. Para Pc eu uso o delphi, pois

usa uma linguagem que já fuço bem.

Minha dúvida é o seguinte.

Eu estou fazendo uma comunicação pela usb com um Uc Pid com usb.

Em determinados momentos o PC vai receber uma array de até 64 bytes que são todos caracteres válidos..

Aí entra o que da Kestão.rs.

Como converter uma array independente de of byte ou char... para string e apresentar em uma memo ou edit...

Se for byte a byte tudo bem... mais eu queria que me ajudassem em um function que já fizesse isso.

Obrigado a todos.

Fabim

Share this post


Link to post
Share on other sites

9 answers to this question

Recommended Posts

  • 0
...Minha dúvida é o seguinte.

Eu estou fazendo uma comunicação pela usb com um Uc Pid com usb.

Em determinados momentos o PC vai receber uma array de até 64 bytes que são todos caracteres válidos..

Aí entra o que da Kestão.rs.

Como converter uma array independente de of byte ou char... para string e apresentar em uma memo ou edit...

Se for byte a byte tudo bem... mais eu queria que me ajudassem em um function que já fizesse isso.

Acredito não seja muito problemático.

Uma coisa a levar em conta é se nesta sequência, poderá estar incluso um caracter nulo(#0). Como este caracter é terminador de string, ao aparecer na sequência, uma simples conversão (que é fácil de obter) resultaria numa string truncada. Neste caso, acho que o mais conveniente seria a apresentação da sequência no formato hexadecimal (como vemos em alguns sistemas similares).

No caso de seu array of byte não conter nulo em qualquer posição, não é necessário nem criar uma função para isto, basta que você faça algo como:

var
   Buffer :array[1..64] of byte;
   Txt :String;
   Idx :Integer;
 begin
  // inicializando para gerar o exemplo
   for Idx := 1 to 64 do
     Buffer[Idx] := 42+Idx;
  // e demonstrando como transformar o array of byte em PChar (essa a parte que lhe interessa)
   Txt := PChar(@Buffer)+#0;
  // Mostrando o texto convertido - você pode concatenar, adicionar a memo
  // qualquer coisa apenas utilizando PChar(@Buffer)+#0 (não necessita da variável)
    ShowMessage(Txt)
 end;

Abraços

Share this post


Link to post
Share on other sites
  • 0

Opa. Desculpe pela demora..

Obrigado MICHEUS.

Fiquei virando o PC uzio de ponta cabeça.. mais a lógica num deu muito certo não.

Pra ageitar o bufferout eu faço assim.

pra pegar as strings eu uso um edit.

txt : string.

bufferout : array[1..64] of byte.

n : byte;

while n < length(txt)+1 do

begin

bufferout[n] := ord(txt[n]);

inc(n)

end;

E pra receber eu uso a logica contraria disso.

Tentei usar o Pchar..... mais ele não retorna nenhuma string valida..

Obrigado pela atenção

Abraços

Fabim

OBS. Quem gosta de tunning ou fazer uns case com mostrador digital ou comunicação que seja

usando microcontroladores pic de 12C a 30F.. tamos aí pra ajudar no que quizerem.

Share this post


Link to post
Share on other sites
  • 0

Opa

Como vem os dados para você, exemplo, você pega eles através

de alguma função certo, se possível poste como você pega os dados

Passando como você recupera os dados da porta USB, talvez pelo

formato em que os dados são passados ou a maneira fica mais

fácil de te ajudar!

abraço

Share this post


Link to post
Share on other sites
  • 0
Opa

Como vem os dados para você, exemplo, você pega eles através

de alguma função certo, se possível poste como você pega os dados

Passando como você recupera os dados da porta USB, talvez pelo

formato em que os dados são passados ou a maneira fica mais

fácil de te ajudar!

abraço

beleza. Acho miózio postar um link com o fonte para o delphi..

Assim fica mais fácil entender o funcionamente do menino.

Tem algumas coisas doidas, mais descartem, foi uns testes que eu fiz.

ó o linkio. www.proenergysafety.com.br/arquivos/projetos/delphihid.rar

Só baixar e se puder me dar um help.. abração

Fabim

Share this post


Link to post
Share on other sites
  • 0
txt : string.

bufferout : array[1..64] of byte.

n : byte;

while n < length(txt)+1 do

begin

bufferout[n] := ord(txt[n]);

inc(n)

end;

E pra receber eu uso a logica contraria disso.

Tentei usar o Pchar..... mais ele não retorna nenhuma string valida..

O uso do PChar como lhe propus é justamente para não ter nada de loop:

na Saída

FillChar(BufferOut, SizeOf(BufferOut), 0); // inicializa buffer com #0 ou 0

StrPLCopy(@BufferOut, Edit1.Text, SizeOf(BufferOut));

na Entrada:

Edit1.Text := PChar(@BufferIn)+#0;

Não é isso que você disse estar querendo fazer?

Abraços

Share this post


Link to post
Share on other sites
  • 0

é isso mesmo micheus..

Na saida de str pra byte... preencho o bufferout com o numero de strings validas no edit1.txt..

No evento de entrada..

Pchar.........

Só que na caixa que apresenta dos dados recebidos.. não aparece nada..

se eu fizer byte a byte.. aí funciona..

De uma bizoiada na procerure button7..

e na função hid event na ultima função... vai entender o que eu estou dizendo..

Baixe o fonte por favor. esta no post à cima..

Abração :)

Fabim

Share this post


Link to post
Share on other sites
  • 0
De uma bizoiada na procerure button7..

e na função hid event na ultima função... vai entender o que eu estou dizendo..

procedure TForm1.Button7Click(Sender: TObject);
 var txt : string;
     m   : cardinal;
     n,b : byte;
 begin
   //se a cacha de secagem "selecionada" sai
   if checkbox1.Checked = true then exit;
   //se a caixa com digitos = nada sai
   if Edit1.Text = ('') then exit;
   //string txt = a caixa com digitos a serem
   //transmitidos
   txt := Edit1.Text;
   //limpacontador n
   n := 0;
   // enquanto n for menor ou igual a quantidade de
   // strings validas de txt faz
   while n <= length(txt) do
   begin
     FBufferout[n] := ord(txt[n]);
     inc(n)
   end;
   // byte 0 do buffer out sempre 0
   FBufferout[0] := 0;
   m := gethandle(Vendor_Id, Product_Id);
   write(m,@FBufferout);
   //limpa string txt
   txt := ('');
   Edit1.Text := ('');
   // responsavel por limpar o bufferout
   // para que não envie dados antigos
   n:= 0;
   while n <= BufferOutSize do
   begin
     FBufferOut[n] := 0;
     inc(n);
   end;
 end;
Aqui você tem um problema a resolver. Se o byte 0 (zero) do buffer out é sempre 0 (zero), o primeiro caracter que você moveu de txt é perdido! Acredito que você tenha que adicionar 1 ao indexador do buffer (FBufferOut[n +1]) também, troque
n:= 0;
   while n <= BufferOutSize do
   begin
     FBufferOut[n] := 0;
     inc(n);
   end;
por
FillChar(FBufferOut, SizeOf(FBufferOut), 0)

Só que na caixa que apresenta dos dados recebidos.. não aparece nada..

se eu fizer byte a byte.. aí funciona..

Se no buffer de entrada a posição 0 (zero), também, tem sempre o valor 0 (zero) então não vai funcionar mesmo. É como citei em minha primeira resposta: 'Uma coisa a levar em conta é se nesta sequência, poderá estar incluso um caracter nulo(#0)...'. Mas se, e somente se, o primeiro caracter vier com o 0 (zero), você ainda poderá fazer desta forma:

na Saída

FillChar(BufferOut, SizeOf(BufferOut), 0); // inicializa buffer com #0 ou 0

StrPLCopy(@BufferOut[1], Edit1.Text, SizeOf(BufferOut) -1);

na Entrada:

Edit1.Text := PChar(@BufferIn[1])+#0;

Estamos pulando o caracter 0 (zero) que está na posição 0 (zero) do seu buffer.

Abraços

Share this post


Link to post
Share on other sites
  • 0

agora funfou :) .....

Brigadão Micheus. vlw merrrrmo.

Agóra so apanhar de outras lógicas. :) .

Pascal pra Ucontroladores é uma sopa, mais pra PC.. hummm.rs

Quando eu preciso dar um cabiocó na logica do pascal pra uControladores eu abro um

ASM

modifico os bytes acerto o que eu quero e

End;

Mais pro delphi é complicado rss.

Abração e obrigado a todos que me ajudaram nos meus

1.0^-32 % de aprendizagem do delphi.rs

áá.. Agora eu sei porque meus amigos diziam pra eu comprar a biblia do delphi. Rapaz que tamãe de livro. :)

Fabim

Share this post


Link to post
Share on other sites
  • 0

Pessoal.

Aproveitando o Post e a paciência dos amigos.

O circuito usando a USB do PIC18F4455, em questão, o qual eu já consegui fazer funcionar belezerinha.

Seguinte o circuito é para uma bateria eletronica, que estou montando para meu irmãozinho, funciona assim.

64 bytes ou 32 que seja..

Toda vez que acontece um evento na usb o programa da uma paradinha trata o que chegou executa e pinba.

No meu caso eu tenho 63 sons reais de bateria de ótima qualidade, os sons variam de 1,2 a 3,8Segundos.

quando chega dados eu dou uma zoiada byte a byte, se diferente de 0 intão eu executo um som wave ou crio um evento de keybd, para usar outros sintetizadores que tem por aí.

Meu problema é que por exemplo executo o bumbo(usando o MP do delphi), quando acontece outro evento do prato por exemplo e executo o wave prato, o som do bumbo não continua. Ele para e o som executado é o do prato..

alguém poderia me dar uma força neste pepino ? Pelo que eu entendi, eu tenho que fazer uma interpolação de dados, tipo.. som prato = 3 segundos(length), se 1.8S eu executo o surdo o programa pega o ponto atual do prato 1.8S e soma deste ponto pra frente com o som do surto e play.. Estou correto?

Fabim.

Share this post


Link to post
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.

Sign in to follow this