herkese merhaba. yeni delfi (7) kullanmaya başladım. seri port işlemleri için aproyu kullanıcam. ancak birtürlü kuramadım. nasıl kurulacağı hakkındada pek bir bilgim yok aslında. hep hata mesajı alıyorum. büyük ihtimalle ben hata yapıyorum. nasıl kurmam gerektiği hakkın da en temel düzeyde bilgi verirseniz çok memnun olurum. delpi ortamına çok yabancıyım. yardımlarınızı bekliyorum.
1.. Dosyaları örneğin c:\DelphiComps\Apro gibi bir yere aç
2. Delphi yi çalıştır. Menüden Tools->Environment Options->Library e git.
3. Buradaki Library Path e source directorysini ekle. Örneğimizde "c:\DelphiComps\Apro\source"
4. Packages directorysine git orada sonu R70 ile biten Runtime package i aç compile et. (İsmi _R70.dpk ile bitmeli)
5. Sonra yine packages directorysinde D70 ile biten designtime package i aç compile et ve install butonuna bas. (İsmi _D70.dpk ile bitmeli)
Artık apro componentleri kullanabilirsin...
dostum sağol o işi hallettim. ilgin için teşekkür ederim. ancak bi sorunum daha çıktı. seri porttan veri gönderme işleminin bittiğini nasıl anlarım?
herkese kolay gelsin iyi çalışmalar
OnTriggerOutSent event i işini görmüyor mu?
yani denedim ama, zannedersem yanlış yaptım. amacım, veriyi gönderme işlemi bittikten sonra seri porta bağlı cihazı (rf kullanıyorum)hemen receive moda almak. eğer kullanmam gereken event buysa bunun üzerine yoğunlaşıyım. teşekkür ederim.
merhaba veriyi gönder dedikten sonra, gönder butonunun enabled ını false yaptım. OnTriggerOutSent tede gönder butonunu enabledını true yaptım. veriyi gönderdikten sonra veri gidiyor. buton false oluyor. ancak gönderme işlemi bittikten sonra buton enabledı true olmuyor neden olabilir? teşekkürler iyi çalışmalar.
type
TForm1 = class(TForm)
ApdComPort1: TApdComPort;
StartBtn: TButton;
StatusLabel: TLabel;
procedure ApdComPort1TriggerStatus(CP : TObject;
TriggerHandle : Word);
procedure FormCreate(Sender: TObject);
public
{ Public declarations }
OutSentTrig : Word;
end;
var
Form1 : TForm1;
implementation
{$R *.DFM}
.
.
.
.
.
.
procedure TForm1.FormCreate(Sender: TObject);
begin
//** comport u aç ayarlarını yap vs.
OutSentTrig := ApdComPort1.AddStatusTrigger(stOutSent);
ApdComPort1.SetStatusTrigger(OutSentTrig, 0, True);
end;
procedure TForm1.ApdComPort1TriggerStatus(CP : TObject;
TriggerHandle: Word);
begin
if TriggerHandle = OutSentTrig then
begin
StatusLabel.Caption := 'Data Gönderildi';
SendButton.Enabled := True;
end;
end;
.
.
.
.
.
bu kodu bir dene istersen
dostum ilgin için çok teşekkür ederim. verdiğin kodu denedim ancak veriyi gönder buyonuna bastığım anda bufferın boş olduğu ile ilgili bir hata mesajı veriyor. halbuki veri var. nolmalde gönderiyordu. ancak yukarıdaki kodu ekleyince sonuç bu oldu.
Yazdığın kodu yapıştırabilirsen bir de öyle bakalım.
buyur usta kod bu. tekrar sağol kardeşim
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OoMisc, AdPort, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
sbServo1: TScrollBar;
Button1: TButton;
ApdComPort1: TApdComPort;
cbID: TComboBox;
cbCommand: TComboBox;
cbPreamp: TComboBox;
cbSecron: TComboBox;
GroupBox1: TGroupBox;
Label6: TLabel;
Label7: TLabel;
GroupBox2: TGroupBox;
Label2: TLabel;
Label3: TLabel;
Panel1: TPanel;
Label1: TLabel;
lbServo1: TLabel;
chSecron: TCheckBox;
Label4: TLabel;
cbBaud: TComboBox;
chUpdate: TCheckBox;
Button2: TButton;
Memo1: TMemo;
CheckBox1: TCheckBox;
Button4: TButton;
Label5: TLabel;
procedure sbServo1Change(Sender: TObject);
procedure Button1EndDrag(Sender, Target: TObject; X, Y: Integer);
procedure cbBaudChange(Sender: TObject);
procedure SendPacket();
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure ApdComPort1Trigger(CP: TObject; Msg, TriggerHandle,
Data: Word);
procedure FormCreate(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure ApdComPort1TriggerStatus(CP: TObject; TriggerHandle: Word);
procedure ApdComPort1TriggerOutSent(Sender: TObject);
procedure ApdComPort1TriggerOutbuffFree(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
OutSentTrig: Word;
end;
var
Form1: TForm1;
c: char;
bir: integer;
sifir: integer;
veri_al: String;
sec: integer;
alma_aktif: boolean;
implementation
{$R *.dfm}
//******************************************************
procedure TForm1.sbServo1Change(Sender: TObject);
begin
lbServo1.Caption := IntToStr(sbServo1.Position);
if chUpdate.Checked = True then
SendPacket;
end;
//******************************************************
procedure TForm1.Button1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
Form1.Caption := 'dd';
end;
procedure TForm1.cbBaudChange(Sender: TObject);
begin
ApdComPort1.Baud := StrToInt(cbBaud.Text);
end;
//******************************************************
procedure TForm1.SendPacket();
var
preamp: string;
secron: string;
servo1pos: string;
command: string;
i: integer;
begin
servo1pos := IntToStr(sbServo1.Position);
case cbCommand.ItemIndex of
0: command := 'O';
1: command := 'P';
end;
preamp := '';
for i := 1 to StrToInt(cbPreamp.Text) do
preamp := preamp + chr($AA);
secron := '';
if chSecron.Checked = True then
begin
for i := 1 to StrToInt(cbSecron.Text) do
secron := secron + chr($FF);
for i := 1 to StrToInt(cbSecron.Text) do
secron := secron + chr($00);
end
else
begin
for i := 1 to StrToInt(cbSecron.Text) do
secron := secron + chr($00);
for i := 1 to StrToInt(cbSecron.Text) do
secron := secron + chr($FF);
end;
ApdComPort1.RTS := False;
sleep(51);
ApdComPort1.Output := preamp + secron + cbID.Text + command +
servo1pos + 'ABCD';
//ApdComPort1.RTS := True;
sleep(97);
button1.Enabled := False;
end;
//***************************************************************
procedure TForm1.Button1Click(Sender: TObject);
begin
SendPacket;
end;
//***************************************************************
procedure TForm1.Button2Click(Sender: TObject);
begin
while sbServo1.Position <> sbServo1.Max do
begin
sbServo1.Position := sbServo1.Position + 1;
sleep(500);
Memo1.Refresh;
Application.ProcessMessages;
end;
sbServo1.Position := 12;
end;
//***************************************************************
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
ApdComPort1.RTS := CheckBox1.Checked;
end;
//***************************************************************
procedure TForm1.ApdComPort1Trigger(CP: TObject; Msg, TriggerHandle,
Data: Word);
begin
c := ApdComPort1.GetChar();
if (c = CHR($00)) and (sifir < 2) then // 3 byte 0xFF al
sifir := sifir + 1
else if (sifir = 2) and (c = CHR($FF)) and (bir < 3) then // 3 byte 0xFF den sonra
bir := bir + 1
else if (bir = 3) then // ilk anlamlı veriyi al
begin
veri_al := veri_al + c; // gelen her veriyi 8 elemanlı veri_al dizisinine yaz
sec := sec + 1;
end;
if (sec = 8) then // alınacak olan veri sayısı sona erdiğinde
begin
sifir := 0; // bütün değerleri sıfırla
bir := 0;
sec := 0;
if veri_al[1] = '0' then
Memo1.Lines.Add(veri_al);
veri_al := '';
end;
end;
//**********************************************************
procedure TForm1.FormCreate(Sender: TObject);
begin
bir := 0;
sifir := 0;
veri_al := '';
sec := 0;
// OutSentTrig := ApdComPort1.AddStatusTrigger(stOutSent);
// ApdComPort1.SetStatusTrigger(OutSentTrig, 0, True);
end;
//**********************************************************
procedure TForm1.Button4Click(Sender: TObject);
begin
Memo1.Lines.Clear;
end;
//*************************************************************
procedure TForm1.ApdComPort1TriggerStatus(CP: TObject;
TriggerHandle: Word);
begin
// if TriggerHandle = OutSentTrig then
// begin
// button1.Caption := 'Data Gönderildi';
// button1.Enabled := True;
// end;
end;
//**************************************************************
procedure TForm1.ApdComPort1TriggerOutSent(Sender: TObject);
begin
button1.Enabled := True;
end;
procedure TForm1.ApdComPort1TriggerOutbuffFree(Sender: TObject);
begin
button1.Enabled := True;
ApdComPort1.RTS := True;
end;
end.
APRO nun kendi örneğini biraz değiştirdim. Bu haliyle çalışıyor.
Senin kodda da bir hata göremedim. Data okuma kısmın farklı bir event ile yazmışsın ama o da doğru. En basitinden APRO Examples içindeki ExCom.dpr örneğini aç aşağıdaki değişiklikleri yap bak bakalım çalışıyor mu? Çalışırsa buraya göre değiştir. Püf noktası TriggerStatus eventinin sonuna tekrar ApdComPort1.SetStatusTrigger(OutSentTrig, 0, True); satırını eklemekmiş. Eklenmeyince bende de çalışmıyor. Ama bu haliyle çalıştı...
(***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is TurboPower Async Professional
*
* The Initial Developer of the Original Code is
* TurboPower Software
*
* Portions created by the Initial Developer are Copyright (C) 1991-2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** *)
{*********************************************************}
{* EXCOM0.PAS 4.06 *}
{*********************************************************}
{**********************Description************************}
{* TApdComPort with an OnTriggerAvail handler. *}
{*********************************************************}
unit Excom0;
interface
uses
WinTypes, WinProcs, SysUtils, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, AdPort, OoMisc;
type
TForm1 = class(TForm)
ApdComPort1: TApdComPort;
Test: TButton;
procedure TestClick(Sender: TObject);
procedure ApdComPort1TriggerAvail(CP: TObject; Count: Word);
procedure FormCreate(Sender: TObject);
procedure ApdComPort1TriggerStatus(CP: TObject; TriggerHandle: Word);
private
{ Private declarations }
OutSentTrig : Word;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.TestClick(Sender: TObject);
{TestClick button click - Send output}
var
i: integer;
begin
Test.Enabled := false;
Caption := 'Data Gidiyor';
for i := 1 to 20 do
ApdComPort1.OutPut := 'dsafsafafafdsafdfdsfsadafdfdfadsafafasfATZ';
end;
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
{Event OnTriggerAvail - Example how OnTriggerAvail works}
var
I : Word;
C : Char;
S : String;
begin
S := '';
for I := 1 to Count do begin
C := ApdComPort1.GetChar;
case C of
#0..#31 : {Don't display} ;
else S := S + C;
end;
end;
ShowMessage('Got an OnTriggerAvail event for: ' + S);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OutSentTrig := ApdComPort1.AddStatusTrigger(stOutSent);
ApdComPort1.SetStatusTrigger(OutSentTrig, 0, True);
end;
procedure TForm1.ApdComPort1TriggerStatus(CP: TObject;
TriggerHandle: Word);
begin
if TriggerHandle = OutSentTrig then
begin
Caption := 'Data Gönderildi';
Test.Enabled := True;
end;
ApdComPort1.SetStatusTrigger(OutSentTrig, 0, True);
end;
end.
dostum kodu şimdi deniyeceğim. ilgin için teşekkür ederim kardeşim. sonucu buraya yazar seni bilgilendiririm. tekrar teşekkürler
merhaba;
dostum bi sorunum daha çıktı. veriyi 4 kere gönderdikten sonra, 1 kere alabiliyorum. yani her 1 veri gönderdikten sonra hemen bir veri almam gerekiyor. hiper terminal de sorun olmadığını görüyorum. devremde problem yok yani . neden olabilir?
iyi çalışmalar.
Bu durumda pek fikir yürütemiyorum. Bence Apro nun örneğinden yola çıkarak elle yazıp gönder gelen veriyi de bir memo içine yazdır öyle kontrol et. Buffer problemi olabilir ya da başlangıç bitiş karakterleri problem yaratabilir.