Delphi CPort Lib Delphi 4 Arduino Com Fonte
Delphi CPort Lib Delphi 4 Arduino Com Fonte
Faz alguns anos que no desenvolvia nada em Delphi (Object Pascal), mas como no comeo deste blog eu
publiquei alguns programas escritos em Delphi recebo com frequncia solicitaes de enviar o fonte ou
algum material, como eu prefiro ensinar a pescar do que dar o peixe, resolvi trabalhar em cima disso, como
j escrevi sobre comunicar serial com Arduino usando Python e pretendo fazer com outras linguagens
desta vez foi a to esperada vez com o Delphi.
No tenho as verses mais recentes e acabei de usar uma j ultrapassada o Delphi 7, porm como
recompensa eu fiz 3 videos alm deste post e o fonte disponibilizado, onde abordei desde o download do
componente(biblioteca para comunicar serial), instalao, configurao e comunicao com a mesma,
ento vamos l:
Foi utilizado:
IDE Borland Delphi 7.0 (Build 4.453)
Componente ComPort Library Version 4.11 by Dejan Crnila
Por que usei ComPort Library ou CPortLib? Poderia usar outros porm precisava de um que primeiro eu j
tenha usado e segundo que no seja pago ou de funcionamento limitado, tem um excelente que usei a um
bom tempo atras o nrComm, esse muito fera, tem vrias melhorias e implementaes que faltam no
ComPort Lib alm de toda implementao para GSM, USB HID e Bluetooth e suporte a vrias verses do
Delphi, mas para implementaes simples e at intermediaria o ComPort perfeito, conforme vai
aumentando falta recursos implementados e que voc deve fazer na mo o tratamento j o nrComm
praticamente entrega a informao em uma varivel ou buffer pra voc.
O componente pode ser baixado aqui ou em www.sourceforge.net/projects/comport/, no abordarei aqui
a instalao do componente e configurao da IDE ento segue o link do vdeo que gravei:
O que eu quero dizer com a Figura03 que o Delphi com o CPortLib comunicar (Enviar/Receber) dados
por comunicao serial, neste exemplo deste artigo estou usando o Arduino UNO, ok! Porm o Delphi e o
CPortLib no sabe o que Arduino, ou seja, eles no sabem o que ir ter do outro lado do cabo pois o
mesmo cdigo eu posso usar para comunicar com um Arduino, PC (Windows ou Linux), Texas LaunchPad
MSP430, Raspberry PI, BeagleBone Black, microcontrolador, ARM Cortex-Mx, onde eu quero chegar que
no importa o que se tem do outro lado implementando corretamente o tratamento da comunicao
serial e a correta implementao do protocolo maravilha comunicar, eu poderia muito bem neste artigo
escrever e tratar o caracter t que ser enviado usando um MSP430 da LaunchPad e funcionaria
perfeitamente com nossa aplicao, espero ter passado a ideia e com clareza.
Vamos agora a um exemplo bem bsico de uso do CPortLib ou ComPort Library o que preferir :)
Comunicao serial bsica de Delphi com Arduino usando ComPort
https://www.youtube.com/watch?v=3Xt96eG9pzg
O que foi utilizado acima muito simples, vamos ver do que precisei:
1) Componente ComPort (CPort) e o name alterado para comport
2) Componente ComTerminal (CPortCtl) e nas propriedades sem ComPort escolher comport
3) Usar as seguintes funes do componente:
comport.Connected
comport.Open
comport.WriteStr('t')
comport.Close
No meu ponto de vista o exemplo mais bsico, simples e funcional para comunicar serial com Delphi,
porm eu acho incomodo usar o ComTerminal salvo caso apenas para monitorar a serial, mas acho legal
usar um Memo e inserir nele o que chegar pela serial alm de outras informaes durante a comunicao
como erros, alertas e status alm de usar mais recursos desse componente, vamos ao terceiro vdeo e mais
completo agora.
Comunicao serial completa de Delphi com Arduino usando ComPort
https://www.youtube.com/watch?v=Cc3Hqdavez0
Agora vamos explorar o que foi utilizado e como utilizado no vdeo acima:
1) Componente ComPort (CPort): Name: comport
2) Componente TMemo com: Name: MemoLog; Lines: Log da comunicao serial; ScrollBars: ssVertical
3) Quatro TButton:
3.1) Name: btnPainelConfig; Caption: Painel; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
3.2) Name: btnOpenPort; Caption: Abrir Conexo; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
3.3) Name: btnComunicar; Caption: Comunicar; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
3.4) Name: btnClosePort; Caption: Fechar Conexo; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
4) Form: Name: FmPrincipal; Caption: Comunicao Delphi 4 Arduino; Position: poDesktopCenter
No terceiro video Comunicao serial completa de Delphi com Arduino usando ComPort eu realizo alguns
tratamentos importantes como:
1) O boto Abrir Conexo s habilitado quando a porta selecionada em Painel
2) Os botes Comunicar e Fechar Conexo s so habilitados aps abrir a conexo com sucesso
3) Aps abrir a conexo o boto Abrir Conexo desabilitado e a qualquer momento voc pode Comunicar
ou Fechar a conexo
4) Caso o operador esquea de ir em Fechar Conexo no evento OnClose do Form ou seja quando o Form
for encerrado o evento comport.Close chamado
5) realizado um Try/Except quando realiza a abertura da conexo como verificar se j no esta aberta ou
alguma outra exceo e o resultado reportado no MemoLog
Aplicao final Figura05.
Cdigo-fonte:
http://cleitonbueno.com/downloads/blog/Delphi4Arduino/ProjetoComunicacaoArduino4Delphi.zip
ComPort Library
www.sourceforge.net/projects/comport/
Vdeos:
Instalando ComPort Library no Delphi 7 para comunicar com Arduino
https://www.youtube.com/watch?v=N1amhXENGHI
Comunicao serial bsica de Delphi com Arduino usando ComPort
https://www.youtube.com/watch?v=3Xt96eG9pzg
Comunicao serial completa de Delphi com Arduino usando ComPort
https://www.youtube.com/watch?v=Cc3Hqdavez0
Este trabalho de Cleiton Bueno, foi licenciado sob uma Licena Creative Commons Atribuio-NoComercialCompartilhaIgual 3.0 Brasil.
Baseado no trabalho em http://www.cleitonbueno.wordpress.com.
Ano: 2014
Link: http://www.cleitonbueno.wordpress.com
Licena: BSD
Use, divulgue, modifique mas se possivel cite a fonte :)
Este trabalho de Cleiton Bueno, foi licenciado sob uma Licena Creative Commons Atribuio-NoComercialCompartilhaIgual 3.0 Brasil.
Baseado no trabalho em http://www.cleitonbueno.wordpress.com.
}
procedure TFmPrincipal.BtnPainelConfigClick(Sender: TObject);
begin
comport.ShowSetupDialog;
btnOpenPort.Enabled := True;
// Aqui voce especifica sua porta serial, diretamente assim...
//comport.Port := 'COM3'
// Ou por um Edit.. assim...
//comport.Port := edtPorta.Text;
// Na opo abaixo o BaudRate
// Tome cuidado com o BaudRate que no apenas para algo como:
// 9600
// Ele tem seu "padro"
//comport.BaudRate
// StopBits
//comport.StopBits
// Paridade
//comport.Parity
// Data Bits
//comport.DataBits
end;
procedure TFmPrincipal.btnOpenPortClick(Sender: TObject);
begin
try
// Abrindo a conexo serial
comport.Open;
if comport.Connected then
begin
MemoLog.Text := MemoLog.Text + 'Conexo serial estabelecida com sucesso ('+comport.Port+')';
MemoLog.Lines.Add(''); //Gambi para ir para proxima linha, nao lembro como usar #13
btnOpenPort.Enabled := False;
btnComunicar.Enabled := True;
btnClosePort.Enabled := True;
end
else
MemoLog.Text := MemoLog.Text + 'FALHA ao abrir conexo serial com ('+comport.Port+')'
Except on E : Exception do
begin
MemoLog.Text := MemoLog.Text + 'ERRO ao abrir conexo: Detalhes> '+E.Message;
end
end
end;
procedure TFmPrincipal.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
// Caso o usuario feche o programa sem fechar a conexo
comport.Close;
end;
procedure TFmPrincipal.btnComunicarClick(Sender: TObject);
begin
// Sem misterio... inserindo a mensagem Comunicando, aguarde...
// no memo e enviando o caracter 't' para a serial...
MemoLog.Text := MemoLog.Text + 'Comunicando, aguarde...';
comport.WriteStr('t');
end;
procedure TFmPrincipal.comportRxChar(Sender: TObject; Count: Integer);
var
RxCount: Integer;
RxComport: String;
begin
// Primeiro, neste componente devemos saber
// a quantidade de bytes recebidos
RxCount := comport.InputCount;
//Agora iremos chamar a funo que ira receber o conteudo
// e informar onde sera armazenado e a quantidade com a variavel
// acima
comport.ReadStr(RxComport,RxCount);
//Enviando para o MemoLog
MemoLog.Text := MemoLog.Text + RxComport;
end;
procedure TFmPrincipal.btnClosePortClick(Sender: TObject);
begin
// Fechando a conexo quando o operador clicar no botao
comport.Close;
// Vamos trabalhar em cima desta ao
if not comport.Connected then
begin
MemoLog.Text := MemoLog.Text + 'Conexo serial finalizada com sucesso ('+comport.Port+')';
btnClosePort.Enabled := False;
btnComunicar.Enabled := False;
btnOpenPort.Enabled := False;
end
else
MemoLog.Text := MemoLog.Text + 'Falha ao finalizar conexo serial.'
end;
end.