Jump to content

Ler/Escrever dados de uma porta COM


Kline777
 Share

Recommended Posts

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 -.-

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
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
 Share

×
×
  • 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.