Read comport

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Armani
Üye
Mesajlar: 104
Kayıt: 18 Mar 2004 05:32
Konum: Ankara

Read comport

Mesaj gönderen Armani »

Arkadaşlar merhaba
bir kaç gündür com portdan bilgi alma ile ilgili araştırma yaptım. Ama malesef bu konuyla ilgili örnek kod bulamadım. Amacım gelen bilgiyi memo ya almak.
Elinizde bu konuda örnek olacak bir kod varsa verirseniz çok sevinirim

Teşekkürler
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Re: Read comport

Mesaj gönderen mege »

Armani yazdı:Arkadaşlar merhaba
bir kaç gündür com portdan bilgi alma ile ilgili araştırma yaptım. Ama malesef bu konuyla ilgili örnek kod bulamadım. Amacım gelen bilgiyi memo ya almak.
Elinizde bu konuda örnek olacak bir kod varsa verirseniz çok sevinirim

Teşekkürler
:arrow: selam daha önceki mesajında cevap yazmadım çünkü hiçbirşey açık değildi. hala değil :)

:idea: en kolay yolu Tcomport componentini kur. mscomm un daha iyi bir delphi versiyonu open source bedava. daha ne olsun.
+ CPort Comport Library http://sourceforge.net/projects/comport/

http://www.wimb.net/index.php?s=delphi&page=11 bu adreste güzel bir terminal programı örneği var. onu indirip port okuma kısmını inceleyebilirsin.


bu arkadaş bence kötü bi recieve uygulama yapmış ama neyse, başlangıç için iyi. forumuna bi comport bileşeni koy. çift tıklayıp gerekli baudrate, parity stop biti ayarlarını falan ayp. formuna 100-200 ms interval ile bir timer koy. timer kesmesinde aşağıdaki bold satırlardaki işlemi yaptır. (manası eğer porttan karakter geldi ise bunu yazdır. gelmedi ise eyvallah bekle)
bu kısma kadar gelirsen problem yok demektir.
iyi çalışamlar

(bu ay içinde bi dersten omron PLC ile haberleşmeli bi program yazıcam. bitirince koduyla beraber herşeyi makaleler kısmına göndericem. ama bitmedi işte :D )

Kod: Tümünü seç

Procedure TForm1.TermReceive;
var Str : string;
      I : Integer;
     Ch : char;
Begin
  Doorgaan := True;
  ContrOld := ContrType;
  While (Doorgaan = True) AND (ContrType = ContrOld) do begin
1->    [b]NumberOfBytes := Comport1.InputCount;
2->    ComPort1.ReadStr(Str, NumberOfBytes);   
3->    IF NumberOfBytes > 0 then Begin[/b]
          IF HexMode = True Then begin
            For I := 1 to length(Str) do begin
              Ch := Str[I];
               If CH < #31 then begin  // smaller then space
                WriteScreen(' <'+ByteHex(Ord(Ch))+'>');
                if Ch = #$0A then WriteScreen(#$0A+#$0D);
             end else WriteScreen(Ch);
          end
       end else
          If ComTerminal1.Visible = True then WriteScreen(Str);
    End;
    sleep(100);
    Application.ProcessMessages;
  end; {while}
end;   { terminal EPI / SS2000I }
Armani
Üye
Mesajlar: 104
Kayıt: 18 Mar 2004 05:32
Konum: Ankara

Mesaj gönderen Armani »

hemen uygulayacagım
çok teşekkürler ilginize
bu konuda acemi oldugum için anlatamıyorum.
yinede teşekkürler
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

alın buyrun denenmiş bi örnek. şimdi canım sıkıldı bari ödevi yapmaya başlayayım dedim.
iletişim com1 üzerinden omron cqm1h plc ile 9600,7,2,even
formda bir adet comport bileşeni , bir timer, birde buton var.
valla tüm pas dosyasını copy paste yapıyorum. buradan anlayabilirsin.

mantık çok kolay. writestr ile porta verini yazıyorsun.
sonra timer ile sürekli olarak portu kontrol ediyorsun. eğer almak istediğin paket boyutu CharCntReceived tamam ise aldığın cRcvBuffer daki bilgiyi string olarak memoya ekliyorsun.

iyi çalışamlar

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPort, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    BtnGonder: TButton;
    Timer1: TTimer;
    Memo1: TMemo;
    procedure BtnGonderClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    cRcvBuffer         : PChar;
    CharCntReceived    : Integer;    
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
cRcvBuffer := StrAlloc(512);
CharCntReceived := 0;
end;

procedure TForm1.BtnGonderClick(Sender: TObject);
begin
CharCntReceived := 0;
comport1.WriteStr('@00RD0000001552*'+#13+#0);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;
    a:string;
begin

x:=comport1.read(cRcvBuffer[CharCntReceived],512);

if x>0 then begin
  a:='';
  for y:=CharCntReceived to CharCntReceived+x-1 do a:=a+crcvbuffer[y];
  Memo1.Lines.Add ('Alınan : '+ a); //Denemek iiçin ana ekrana memo ekle
end;
CharCntReceived := CharCntReceived +x;
end;

end.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

.dfm'sini de gönder istersen. Böylece yaptığın ayarlarda gözükür.

Teşekkürler.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

comport1 in ayarları.

Kod: Tümünü seç

  object ComPort1: TComPort
    Connected = True
    BaudRate = br9600
    Port = 'COM1'
    Parity.Bits = prEven
    StopBits = sbTwoStopBits
    DataBits = dbSeven
    Events = [evRxChar, evTxEmpty, evRxFlag, evRing, evBreak, evCTS, evDSR, evError, evRLSD, evRx80Full]
    FlowControl.OutCTSFlow = False
    FlowControl.OutDSRFlow = False
    FlowControl.ControlDTR = dtrDisable
    FlowControl.ControlRTS = rtsDisable
    FlowControl.XonXoffOut = False
    FlowControl.XonXoffIn = False
    Left = 48
    Top = 32
  end
Armani
Üye
Mesajlar: 104
Kayıt: 18 Mar 2004 05:32
Konum: Ankara

Mesaj gönderen Armani »

mege selamlar
writestr ile porta verini yazıyorsun.
bunu anlayamadım. Benim amacım şu an kullandıgım santralden com1 ile bilgi almak. Santralden com1 e data geliyor.
Birde kodu çalıştırınca

Kod: Tümünü seç

[Error] Unit1.pas(33): Undeclared identifier: 'cRcvBuffer'
[Error] Unit1.pas(34): Undeclared identifier: 'CharCntReceived'
[Error] Unit1.pas(39): Undeclared identifier: 'CharCntReceived'
[Error] Unit1.pas(49): Undeclared identifier: 'cRcvBuffer'
[Error] Unit1.pas(49): Undeclared identifier: 'CharCntReceived'
[Warning] Unit1.pas(60): Text after final 'END.' - ignored by compiler
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
hatasını alıyorum. (Form Create kısmında)

Burda diger bir sorum ise (Sanki bu problemleri hallettimde :? ) memoya gelen datalarda mesela tarih kısmını almama gibi bir şansım varmı.[/quote]
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Armani yazdı:Birde kodu çalıştırınca

Kod: Tümünü seç

[Error] Unit1.pas(33): Undeclared identifier: 'cRcvBuffer'
[Error] Unit1.pas(34): Undeclared identifier: 'CharCntReceived'
[Error] Unit1.pas(39): Undeclared identifier: 'CharCntReceived'
[Error] Unit1.pas(49): Undeclared identifier: 'cRcvBuffer'
[Error] Unit1.pas(49): Undeclared identifier: 'CharCntReceived'
[Warning] Unit1.pas(60): Text after final 'END.' - ignored by compiler
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
hatasını alıyorum. (Form Create kısmında)

Burda diger bir sorum ise (Sanki bu problemleri hallettimde :? ) memoya gelen datalarda mesela tarih kısmını almama gibi bir şansım varmı.
değişkenler tanımlı değğil diyor. bi kontrol et. klasik cevaptır ama bende çalışıyor :D
eğer porta bişey yazmıcaksan o butonu kaldır :) sadece okuma yap.
memoya geldikten sonra istediğin gibi parse edersin. bence ilk önce programını çalıştır.
Kullanıcı avatarı
dtgb
Üye
Mesajlar: 175
Kayıt: 07 May 2004 10:02

TComPort nesnesi

Mesaj gönderen dtgb »

merhabalar
yazılı kodda
ComPort1: TComPort;
nesnesi kullanılmıs nereden ekleyebiliriz acaba?
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Resim

..::|YeşilMavi|::..
mape
Üye
Mesajlar: 1
Kayıt: 17 Mar 2008 04:07

Re: Read comport

Mesaj gönderen mape »

mage arkadasım saol cok guzel yardım cı olmussun benımde boyle bır sıkıntım vardı hemen deneyecem tekrar saol
Cevapla