Jump to content
Kline777

Ler/Escrever dados de uma porta COM

Recommended Posts

Kline777

Bem, parece incrivel mas por acaso nunca tinha tido necessidade de ler dados de uma porta COM com o Delphi. Já o fiz com o .NET e é bastante facil. Não estou a conseguir com o Delphi... nem me parece ter nada nativo para ler/escrever em determinada porta COM facilmente.

Alguém tem alguma ideia de uma maneira facil de escrever e ler valores da porta COM?

Share this post


Link to post
Share on other sites
nunopicado

Tudo se arranja... :)

Por acaso até há pouco tempo também não tinha tido necessidade disso.

Quando fui procurar, descobri que é possível comunicar nativamente, usando a API do windows a partir do Delphi.

Mas como não andamos aqui para perder ou fazer perder tempo, toma lá isto:

http://sourceforge.net/projects/comport/

É um componente de comunicação com a COM Port.

Uso-o para comunicar com uma balança e receber o peso, mas com certeza podes fazer muito mais com ele... :)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Kline777

Pois... foi isto que também encontrei. Mas não estou a conseguir ler nada do dispositivo, neste caso um medidor. Com .NET estou a conseguir, por isso nao deve ser por erro dos baudrates, paridades etc... Simplesmente nao me devolve nada no read...

Lembras.te se tiveste que fazer alguma coisa de especial?

Isso traz o TComPort, configuras a porta, chamas o Open(); e ele deve disparar o RxChar() quando recebe um valor certo?

Share this post


Link to post
Share on other sites
nunopicado

No meu caso, a balança exige que lhe envie uma sequência, só depois é que ela retorna o valor.

Esse não tem nada disso?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Kline777

Tem... estou a fazer

 ComPort1.Write('SD',Length('SD'));
 ComPort1.Read(s,length(s));

Que barbaridade é que tenho aqui mal? :/ Estás a usar os mesmos eventos?

Share this post


Link to post
Share on other sites
nunopicado

Ora, então tenho algo assim:

Inicialização do componente:

Com:=TComPort.Create(Self);
                 with Com do
                      begin
                           Port:='COM'+GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,1,',');
                           BaudRate:=TBaudRate(StrToInt(GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,2,',')));
                           Parity.Bits:=TParityBits(StrToInt(GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,3,',')));
                           DataBits:=TDataBits(StrToInt(GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,4,','))-5);
                           StopBits:=TStopBits(StrToInt(GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,5,',')));
                           FlowControl.FlowControl:=TFlowControl(StrToInt(GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,6,',')));
                           Timeouts.ReadInterval:=StrToInt(GetField(dm.qEmpresa.FieldByName('BalancaConfig').AsString,7,','));
                      end;
                 try
                    Com.Connected:=True;
                 except
                    ShowMessage(cErrBalanca,epNone);
                 end;
                 if Com.Connected
                    then begin
                              Com.Open;
                              Com.OnRxChar:=ComRxChar;
                              Timer:=TTimer.Create(Self);
                              Timer.Interval:=1000;
                              Timer.OnTimer:=TimerTimer;
                         end;

para enviar a sequência, uso isto:

Com.WriteStr(Dec2Ascii(dm.qEmpresa.FieldByName('BalancaTXSequence').AsString));

E o event handler da recepção é:

procedure TfMain.ComRxChar(Sender: TObject; Count: Integer);
var
  Rx:String;
begin
    // Lê e formata o resultado da balança
    Com.ReadStr(Rx,Count);
end;

Ajuda?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Esse só converte uma string de numeros, em grupos de 3, em letras

Ex.: 065067

Converte em AC

(065=A),(067=C)

Queres codigo disso?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Ler 3 caracteres, e fazer Char(Str2Int(...)), imagino? :D

  • Vote 1

Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Tal e qual...

A ideia por tás disto é que há caracteres nas sequencias que é complicado representar em ASCII, pelo que assim, guardo na DB os decimais, e na hora converto e envio!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Kline777

Tinha a ver com a configuraçao da comunicação à porta. O handshake no RequestToSend.... nunca tal tinha visto -.-

Perdoem-me a expressão mas como se diz na minha terra: Quando não se sabe f**** até os co****s estorvam -.-

Share this post


Link to post
Share on other sites
nunopicado

Significa então que já está OK... :) Assim é que eu gosto!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Muito obrigado pela ajuda ;)

Estamos cá pra isso! :)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.