Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

delphi UDP problemi

Başlatan MCansız, 16 Ekim 2014, 17:16:24

MCansız

merhaba arkadaşlar STM32f4-discovery kartım ile internet uygulaması yapıyorum kart server olarak çalışıyor ve bana veri yolluyor bende bilgisayardan  verileri ekrana yansıtıyorum


sistem söyle 123 verisini yolladığım zaman kartım adc verilerini yollamaya başlıyor  ve her 2ms de bu veri yollamak zorundayım
gelen verileri delphi indy companentini kullanıp  timer ile 2ms bir 123 yolayıp adc  alıyorum ve labellere yerleştiriyorum burada sıkıntı yok  herşey normal çalışıyor

bilgisayarın internet bağlantısı kestiğimde(jak çıkarıldığında veya stmdiscovery kapatıldığında) veri gelmeye devam ediyor  :o  yani program hata da verimiyor delphi internet yokken bu verileri nereden alıyor?

delphi kodlarım

procedure TForm1.FormCreate(Sender: TObject);
begin

IdAntiFreeze1.Active:=true; //ekleyin yoksa kilitlenirsiniz
IdAntiFreeze1.OnlyWhenIdle:=true;
IdAntiFreeze1.IdleTimeOut:=10

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

IdUDPClient1.Host:=Edit1.Text;
IdUDPClient1.Port:=10001;
IdUDPClient1.ReceiveTimeout:=10;
IdUDPClient1.Connect;
IdUDPClient1.Send('123');
Timer1.Enabled:=true;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var
buffer: Array of char;
i:byte;
metin,sonuc:ansistring;
begin

        if IdUDPClient1.Connected then
        begin
           IdUDPClient1.Send('123');
           gelenveri:=IdUDPClient1.ReceiveString();
           sonuc:=leftStr(gelenveri,4); //sağdan 5 karakteri al
           Form1.Caption:=sonuc;

                if sonuc='adc1' then  Label1.Caption:=gelenveri;
                if sonuc='adc2' then  Label2.Caption:=gelenveri;
                if sonuc='adc3' then  Label3.Caption:=gelenveri;
                if sonuc='adc4' then  Label4.Caption:=gelenveri;

        end;
    end;





Salih

Gelen veriler anlamlımı. Yani buffer'da daha önce gelen verileri tekrar alıp gösteriyor olmasın.

MCansız

Alıntı yapılan: salih - 16 Ekim 2014, 19:37:40
Gelen veriler anlamlımı. Yani buffer'da daha önce gelen verileri tekrar alıp gösteriyor olmasın.

gelen veriler adc1adc2adc3 şeklinde devam ediyor bunu değiştirip bir değişkeni(char tipi) sürekli arttırıp yolladım sayıları düzenli olarak görmek için 100ms de bir gönderdim 0..255 0.. 255 şeklinde sayılar ekranda gözüktü interneti kapattığımda sayma işlemi de durdu sorun benim adc değişekmlerini çok hızlı bir şekilde göndermem ve

gelenveri:=IdUDPClient1.ReceiveString();


kodunda IdUDPClient1.ReceiveString() fonksiyonunu bu verilerle şişmesi haliyle internet kesilse bile gelenveri değişkeninde hafızada kalan veriler tekrar yükleniyor.

Şimdi benim  IdUDPClient1.ReceiveString() fonksiyonunu her okumadan sonra temizlemem lazım bunu şimdilik beceremedim yada IdUDPClient companenti bağlantının kopmasını algılatmama lazım tuhaf bir durum ki UDP haberlemesinde bağlantı kopmaları algılanamıyormu  yoksa bilmediğim birşeymi var

mur@t

Alıntı yapılan: mk_29 - 17 Ekim 2014, 11:31:23
Şimdi benim  IdUDPClient1.ReceiveString() fonksiyonunu her okumadan sonra temizlemem lazım bunu şimdilik beceremedim yada IdUDPClient companenti bağlantının kopmasını algılatmama lazım tuhaf bir durum ki UDP haberlemesinde bağlantı kopmaları algılanamıyormu  yoksa bilmediğim birşeymi var

UDP de bağlantı kontrolü yapılmaz, TCP kullanma şansınız varsa bu dediğinizi yapabilirsiniz.

mufitsozen

#4
Alıntı yapılan: mur@t - 17 Ekim 2014, 16:41:34
UDP de bağlantı kontrolü yapılmaz, TCP kullanma şansınız varsa bu dediğinizi yapabilirsiniz.

sayin mur@t'in bahsettigi gibi UDPde baglanti yoktur.

Kavram olarakda SMSle mesaj yollamaya benzer . O kadarki teslimat garantisi yoktur. Networkde ki yogunluk vs gibi bir kosuldan dolayi karsi tarafa gonderilmeyebilir.

O yuzden UDP ile mesaj gonderirken ardasik olarak bir 'sira numarasi' yada 'timestamp' gibi bilgi yollamakta ve gerekiyorsa bigiyi tekrardan istemekde fayda vardir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

trinity


MCansız

 delphi xe5

şimdi benim istediğim veri sürekli geliyormu onu anlamak mikroc nin udp terminal programı istediğim gibi çalışıyor (delphide yazılmış)



burada verileri alıyorum interneti kestiğinde veride kesiliyor ama benim programımda ard arda veri yollayınca aka planda verileri topluyor internet kesilse bile veri geliyormuş gibi gösteriyor delphide ki udpsocket comapanentini kullandığımda  internet kesilince forum donuyor bu udp terminal programında hangi compannenti kullandılar acaba

trinity

udpsocket componenti internet kesilince kilitleniyor, receive kısmını try-except bloğu içersine alırsan internet kesilince program hata mesajı gösterir ve program kitlenip donmaz.

MCansız

Alıntı yapılan: trinity - 18 Ekim 2014, 00:36:00
udpsocket componenti internet kesilince kilitleniyor, receive kısmını try-except bloğu içersine alırsan internet kesilince program hata mesajı gösterir ve program kitlenip donmaz.

söyle birşey denedim ama bu seferde kitlendi bir fark yok

procedure TForm1.Button1Click(Sender: TObject);
var oku:ansistring;
begin
UdpSocket1.Connect;
UdpSocket1.Sendln('123');
Timer1.Enabled:=true;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var oku:ansistring;
begin
 try
    UdpSocket1.Sendln('123');
    oku:=UdpSocket1.Receiveln();

    Memo1.Lines.Add(oku);
     except
         begin
            timer1.Enabled:=false;
            edit1.Text:='hata';
            UdpSocket1.Disconnect;
            UdpSocket1.Active:=false;

         end;
         end;

end;

trinity

#9
Aynı soket üstünden hem okuma hem yazma olmuyormuş, yazmak için ayrı okumak için ayrı soket kurmak gerekiyormuş. Yabancı forumlarda böyle yazmışlar ama bende bir örnek bulamadım.

MCansız

bende bir örnek bulamadım yapmaya çalıştım daha kötü oldu artık UDP haberleşmesini bırakıp TCP haberleşmesine yöneleceğim çok zamanımı yedi bu sıkıntı

Klein

udp sokete  receive timeout değeri verdiniz mi?

ayrıca 2ms çok yükesk bir hız.

MCansız

Alıntı yapılan: Klein - 20 Ekim 2014, 06:12:07
udp sokete  receive timeout değeri verdiniz mi?

ayrıca 2ms çok yükesk bir hız.

receive timeout 50 olarak kullanıyorum

bugün sistemi sahada test ettim barajın kapılarını uzaktan açıp kapatabiliyorum ve adc(yükseklik vs) alıyorum aynı zamanda burada IP kameralar var kameralara cep telefonundan bağlanıyoruz ben stm sistemime bağlanıp veri almaya başlayınca kamera iletişimi kesiliyor stm iletişimi kesince kameralardan veri alabiliyoruz  stm 168 mhz de çalışıyor hiç gecikme yapmadan verileri yolladığım için modemin bunlara cevap vermesi zor oluyor galiba sorunu delphide aramak yerine stm de yollana veriyi 1sn veya 500ms de bir gönderip deneyeceğim hemde delphi arka planda şişmemiş olur ve internet koptuğunda veri akışıda durur bu arada mikrocnin net_ethernet_28j60 tcp kütüphenesini çözmeye çalışıyorum veriyi yolayabiliyorum ama almayı başaramadım bunu yapabilirsem tcp ye yöneleceğim bu sayede sistem daha güvenli olur düşüncesindeyim.