Jump to content

Recommended Posts

Posted

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?

Posted

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.

Posted

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?

Posted

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.

Posted

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.

Posted

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.

Posted

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.

Posted

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

Posted

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.

Posted

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.

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.