ComPort Veri Alma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

ComPort Veri Alma

Mesaj gönderen pro_imaj »

Merhaba,

Com port ile ilgili forumda yoğun araştırdım ama tama cevaba ulaşamadım. :oops:

Ben bilg. uyumlu bir tartı makinesinden bilgi almaya çalışıyorum ve bilgi comport bağlantısı ile alınıyor normalde bildiğim işlem klavyeden bilgi girişi gibiydi ama olmuyor ancak hyper terminal ile varsayılan bir bağlantı oluşturup denedim ve veriyi bu şekilde alabiliyorum.

Delphi ile bu ayarları yazabileceğim veya comporttan bilgiyi nasıl alabilirim acaba yardımlarınız için teşekkürler.

not:apro kullanmak zorundamıyım yoksa direk yapabilirmiyim.

Saygılarımla.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

Comport kullanımı ile ilgili sanırım bazı komponentler vardı ama benim hiç tecrübem olması ne yazıkki :(
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

tpapro bileşeni ile alabilirsin. Sourceforge'da var. Turbopower AsyncPro olarak da geçer. Forumda tartı diye bir aratsana, daha önce dijital tartı hakkında daha da detaylı bir yanıt verdiğimi hatırlıyorum.
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

comport veri yapısı

Mesaj gönderen kutal »

herkese merhaba,
yeni bir üyeyim böyle bir paylaşım ortamını hazırlayanlara ve burada olanlara teşekkürler.

benim sorunum da comport uygulamasyla ilgili olduğu için ayrıca bir başlık açmayı tercih etmedim.
sorun şu:

RS232 portunda, bir veri katarının içinde var olan hexadecimal 0x00 baytını memoya nasıl yazdırabilirim. ComPortRxChar () proseduründe read() ya da readstr () fonksiyonlarıyla porta gelen veriiyi alabiliyorum.
Ancak:
aaa#1#0#0#1bbb verisini gönderdiğimi var sayarsanız;benim yazdığım kodda aldığım veri aaa#1#1bbb şeklinde oluyor ortadaki 2 bytı kaybediyorum.
ne tavsiye edersiniz?

şimdiden herkese ilgilendikleri için çok teşekkürler.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Re: comport veri yapısı

Mesaj gönderen pro_imaj »

kutal yazdı:herkese merhaba,
yeni bir üyeyim böyle bir paylaşım ortamını hazırlayanlara ve burada olanlara teşekkürler.
Merhaba öncelikle hoşgeldiniz hocam.

Siz galiba benden bu konuda bir adım öndesiniz hocam comporttan bilgi alma hakkında bana yardımcı olabilrmisiniz acaba.

@colerad hocam tartı diye arattım bir sorunuç bulamadım daha önce dediğim gibi comport diye rama yaparak tüm cevapları gözden geçirdim ama bişey bulamadım. Apro bileşenini indirdim ve kurdum ama sonrası :oops:

Saygılarımla
Teşekkürler.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

cport

Mesaj gönderen kutal »

selam
sizden bir adım önde olduğum söylenemez sadece ilgi yada çalışma alanlarımız farklıdır heralde.

ben delphi 7 cport elemanını kullanarak rs232 verilerini alıp gönderebiliyorum.bunun için elemanı forma yerleştirmeniz ve
ComPort.ShowSetupDialog;
ComPort.WriteStr(gönderilecek string ifade);
ComPort.readStr(alınacak string ifade),
fonksiyonlarını(procedure) kullanabilirsiniz.
öncelikle ComPort.ShowSetupDialog; dan ilk değerleri girmelisiniz sonra veri alıp gönderebilirsiniz.

not: ilgili konular "baudrate,parity,stopbit,port numarası vs."
saygılar.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba,

Aproyu kurdum ve ApdComPort1 bileşenini forma koydum Auto open özelliğini True yaptım. Bu konuda örnek yapan ark. varnmı acaba.

Saygılarımla
Kolay gelsin.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

Mesaj gönderen kutal »

apro yu daha önce kullanmadım bu konuda yardımcı olamam ama benim bahsettiğim olayı uygulamanızın çok kolay olacağını düşünüyorum.
bu konuda yardımcı olabilirim.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

kutal yazdı:apro yu daha önce kullanmadım bu konuda yardımcı olamam ama benim bahsettiğim olayı uygulamanızın çok kolay olacağını düşünüyorum.
bu konuda yardımcı olabilirim.
Merhaba O zaman sizden şöyle bir ricam olacaktı cport bileşenini nereden download edebiliriz. comportaki ayarlar ise şöyle

Verinin alınacağı port := Comport1
Saniyedeki Bit sayısı :=9600
Veri Bitleri:=8
Eşlik :=Yok
Dur bitleri:=1
Akış denetimi :=Yok

Bu ayarlar windowstaki heyper terminal ile yapınca veriyi orada gösteriyor benim yapmam gereken bu ayarları bir comport bileşenine yaptırmam ve Sonucuda bir edite aldırmam.

Yardımlarınız için çok tşk ederim
Saygılarımla.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

forumda bu konuda bilgi yok diyemezsiniz. onlarca örnek hazır fonksiyonlar falan filan verildi, yok balık istiyorsanız buyrun etis ve baykonla çalışan bir örnek. yok balık istemem kendim avlıcam diyorsanız forumun offline halini indirip bir inceleyin derim :)

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OoMisc, AdPort, ADTrmEmu, StdCtrls, ExtCtrls, LMDControl,
  LMDBaseControl, LMDBaseGraphicControl, LMDGraphicControl,
  LMDLEDCustomLabel, LMDLEDLabel;

type
  TForm1 = class(TForm)
    ApdComPort1: TApdComPort;
    Button1: TButton;
    Edit2: TEdit;
    AdTerminal1: TAdTerminal;
    Timer1: TTimer;
    Label2: TLabel;
    LMDLEDLabel1: TLMDLEDLabel;
    procedure ApdComPort1TriggerAvail(CP: TObject; Count: Word);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure LMDLEDLabel1Click(Sender: TObject);
  private
    cRcvBuffer         : PChar;   // Gelen verinin tutulduğu buffer değişken
    CharCntReceived    : Integer; // Porta gelen veri sayısı
    SonOkunanKilo      : integer;
    UpCounter          : integer;
    bClose             : boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
 cRcvBuffer := StrAlloc(30);
 for i:=0 to 29 do cRcvBuffer[i] := #0;
 CharCntReceived := 0;
 SonOkunanKilo := 0;
 UpCounter := 0;
 bClose:= FALSE;
 Apdcomport1.AutoOpen:= TRUE;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
StrDispose(cRcvBuffer);
end;

{---------------------------------}

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var LastCount,I,j : integer;
    TempSonOkunanKilo:integer;
    sTemp:string;
begin

LastCount:= Count;
for I := 1 to LastCount do
 begin
  cRcvBuffer[CharCntReceived]:= ApdComPort1.GetChar;
  inc(CharCntReceived);
  if Edit2.Visible then Edit2.Text:= cRcvBuffer;
    if (CharCntReceived >=18) then
     begin
       CharCntReceived := 0;
       sTemp:= copy(cRcvBuffer,length(cRcvBuffer)-8,5);
       try
         TempSonOkunanKilo:= strtoint(sTemp);
       except
         TempSonOkunanKilo:= SonOkunanKilo;
       end;
        SonOkunanKilo:= TempSonOkunanKilo;
        inc(UpCounter);
        LMDLedLabel1.Value:=SonOkunanKilo;
       for j:=0 to 29 do cRcvBuffer[j]:= #0;
     end;
 end;
end;






procedure TForm1.Button1Click(Sender: TObject);
begin
Apdcomport1.AutoOpen:= FALSE;
Apdcomport1.Open:= FALSE;
bClose:= TRUE;
Form1.Close;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= bClose;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
label2.Caption := inttostr(UpCounter);
UpCounter := 0;
end;

procedure TForm1.LMDLEDLabel1Click(Sender: TObject);
begin
 Edit2.Visible := NOT Edit2.Visible;
end;

end.

Kod: Tümünü seç

  object AdTerminal1: TAdTerminal
    Left = 680
    Top = 8
    Width = 300
    Height = 41
    CaptureFile = 'APROTERM.CAP'
    ComPort = ApdComPort1
    Scrollback = False
    Color = clBlack
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clSilver
    Font.Height = -12
    Font.Name = 'Terminal'
    Font.Style = []
    ParentColor = False
    ParentFont = False
    TabOrder = 2
  end
  object ApdComPort1: TApdComPort
    ComNumber = 1
    Baud = 9600
    Parity = pEven
    DataBits = 7
    InSize = 50
    TraceName = 'APRO.TRC'
    LogName = 'APRO.LOG'
    OnTriggerAvail = ApdComPort1TriggerAvail
    Left = 376
    Top = 8
  end
  object Timer1: TTimer
    OnTimer = Timer1Timer
    Left = 424
    Top = 8
  end
end
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

mege yazdı:

Kod: Tümünü seç

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= bClose;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
label2.Caption := inttostr(UpCounter);
UpCounter := 0;
end;

procedure TForm1.LMDLEDLabel1Click(Sender: TObject);
begin
 Edit2.Visible := NOT Edit2.Visible;
end;

end. 
Hocam bu kısmı hangi amaç için kullanıyorsunuz acaba. Button 1 tıklanıldığı zaman porttaki veri lmd label1e geliyor. button1 click olayında formu close yapmışsınız :oops:

Saygılarımla
@mege hocam
çok saolun hocam.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
kutal
Üye
Mesajlar: 48
Kayıt: 14 Kas 2005 10:48

Mesaj gönderen kutal »

http://datamaster2000.tripod.com/download.htm
burada olacak.

bu arada sorunumu çözdüm.başkabir uygulamamın formunu kullanıyordum.discardnull=true olduğundan #0 ları alamıyormuşum.

gereksiz meşgul ettiysem kusura bakmayın.

saygılar.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba,

@mege hocam çok tşk ederim verdiğiniz kod ile comporttan bilgi aldım.

Yardımlarınız için çok saolun Allah (cc) sizden razı olsun.

Saygılarımla
Çalışmalarınızdaki başarılarınızın daim olması dileğiyle.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

apro daki TApdDataPacket olsukça faydalı birşeymiş :) işleri oldukça basitleştiriyor :) onuda bir inceleyin. yukarıdakiyle aynı işi yapan program için:

Kod: Tümünü seç

...
  public
   rSonOkunan:real;
    { Public declarations }
  end;
......

procedure TForm1.ApdDataPacket1StringPacket(Sender: TObject; Data: String);
begin
rSonOkunan := StrToCurrDef(copy(Data,7,8),rSonOkunan);
edit1.Text := Floattostr(rSonOkunan);
end;

Kod: Tümünü seç

  object ApdComPort1: TApdComPort
    ComNumber = 1
    Baud = 9600
    Open = True
    TraceName = 'APRO.TRC'
    LogName = 'APRO.LOG'
    Left = 16
    Top = 16
  end
  object ApdDataPacket1: TApdDataPacket
    Enabled = True
    EndCond = [ecString]
    StartString = 'S'
    EndString = ' g'
    ComPort = ApdComPort1
    PacketSize = 16
    OnStringPacket = ApdDataPacket1StringPacket
    Left = 48
    Top = 16
  end
kötü taarafı paket yönetimi işini elinizden tamamen kaybediyorsunuz :? ama çok tanımlı bir iş ise cidden güzel :)
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Mesaj gönderen pro_imaj »

Merhaba;
@mege hocam yukarıdaki verdiğiniz ilk kod ile bağlantı sağlıyorum elektronik tartıdan bilgiyi sorunsuz alıyorum fakat el terminalinden alırken şöyle bir sorun oluşuyor.

Kod: Tümünü seç

-----Aldığım veriler

0
04
047
0470
04701
047010
0470100
04701005
047010050
0470100505
04701005050
047010050500
0470100505000
04701005050000
047010050500001
0470100505000010
04701005050000104
047010050500001047
0
01
010
0100
01005
010050
0100504
01005040
010050400
0100504000
01005040000
010050400001
0100504000010
01005040000104
010050400001047
0100504000010470
01005040000104701
010050400001047010
0
05
050
0503
05030
050300
0503000
05030000
050300001
0503000010
05030000104
050300001047
0503000010470
05030000104701
050300001047010
0503000010470100
05030000104701005
050300001047010050
2
20
200
2000
20000
200001
2000010
20000104
200001047
2000010470
20000104701
200001047010
2000010470100
20000104701005
200001047010050
2000010470100501
20000104701005010
200001047010050100
0
00
001
0010
00104
001047
0010470
00104701
001047010
0010470100
00104701005
001047010050
0010470100500
00104701005000
001047010050000
0010470100500000
00104701005000000
001047010050000001





-----Olması gereken veriler :oops: 

047010050500001
047010050400001
047010050300001
047010050200001
047010050100001
Acaba böyle okumasının nedeni ne olabilir. Nasıl bir çözüm yolu önerebilrsiniz.

Teşekkür Ederim.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Cevapla