Application Error Exception EInOutError Hatasını durdurmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen aegean »

Sayın arkadaslar yazdıgım programda Usb comport emulatörü ile calısan comport a bağlanarak oradan veri alıyorum kullanıcı usb den cihazı program calısırken çıkarırsa diye usb device ları kontrol eden bir bölüm ekledim

Kod: Tümünü seç

//declaration
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
//////////////

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var
  prt: PDEV_BROADCAST_PORT;
  port: integer;
begin
  if Msg.wparam =  DBT_DEVICEREMOVECOMPLETE then
    if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
      begin
        b_PortRemoved := True; //check this flag before each operation with port.
        prt := PDEV_BROADCAST_PORT(PDEV_BROADCAST_PORT(Msg.lParam));
        s := prt.dbcp_name;
      try
        sleep( 200);
        if port1.Open  then begin
          port1.Open:=false;
          Button1.Caption:='Baglan';
          ApdStatusLight1.Lit:=false;
          ApdStatusLight2.Lit:=false;
          ApdStatusLight3.Lit:=false;
          ApdStatusLight4.Lit:=false;
          ApdStatusLight5.Lit:=false;
          ApdStatusLight6.Lit:=false;
          ApdStatusLight7.Lit:=false;
        end;
      except on e:exception do e.CleanupInstance;
      end;
        Memo1.Lines.Add('ComPort ' + s + ' has been removed.');
    end;
  if Msg.wparam =  DBT_DEVICEARRIVAL then
    if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
    begin
        prt := PDEV_BROADCAST_PORT(PDEV_BROADCAST_PORT(Msg.lParam));
        z := prt.dbcp_name;
        port:=strtointdef(rightstr(z,1),3);
       // USB-COM plugged, you can find it and make some reinitialisation
      if b_PortRemoved  then begin
          sleep( 200);
          port1.ComNumber:=port;  
          port1.Open:=true;
          Button1.Caption:='Baglandı';
          if port1.DTR then ApdStatusLight2.Lit:=true
             else           ApdStatusLight2.Lit:=false;
          if port1.CTS then ApdStatusLight3.Lit:=true
             else           ApdStatusLight3.Lit:=false;
          if port1.DSR then ApdStatusLight4.Lit:=true
             else           ApdStatusLight4.Lit:=false;
          if port1.Open then ApdStatusLight4.Lit:=true
             else            ApdStatusLight4.Lit:=false;
          if port1.CharReady then ApdStatusLight5.Lit:=true
             else            ApdStatusLight5.Lit:=false;
      end
      else begin
          Edit1.Text:=inttostr(Comno);
          Edit2.Text:='19200';
          Edit3.Text:='8';
          Edit4.Text:='1';
          RadioButton1.Checked:=true;
          port1.Open:=false;
          Button1.Caption:='Baglan';
      end;
       Memo1.Lines.Add('ComPort ' + z + ' has been plugged'+inttostr(port));
    end;
end;

Bu bölüm cok güzel calsıyor ve hangi cihaz hangi port sokulup baglanırsa o kapatılıp acılıyor. Ama bu program devreye girip comport kapatılana kadar sürede
hata.jpg
hata.jpg (1.93 KiB) 978 kere görüntülendi
seklinde hata mesajı geliyor ve tabi enter ile mesajı kapatmayınca program işlemeye devam etmiyor. Bu ahat tabiki önemsiz bir hata cünkü yapılması gerekenler zaten yapılacak ama bu hatayı programda bir türlü yakalayıp ekrana gelmesini durduramadım. Try blogu işe yaramaz çünkü programatik bir olay değil device in out hatası Bunu için application.onexcept ve bazı low level örnekleri denedim fakat hiç biri bu hatayı yakalayamadı.
ayrıce madexcept de denedim hatayı yakaladı ama o da ekrana kendi eylem iletisini cıkartıyor ve onu da bir türlü kapatamadım yanı ben bu hata geldiçinde onu ignore edecek bir program yapısına ihtiyacım var
Bu sorunum için bir önerisi olan arkadaş olursa simdiden tesekkür ederim iyi çalısmalar dileğiyle.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen aegean »

Hata ileti resmi cok kucuk olmus ve okunmuyor
Application Error
exception EInOutError in module comtest.exe at 00241e76
Device read error
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen freeman35 »

google dan "delphi serial port example" anahtar cümleden çıkan bazı arama sonuçları

https://www.youtube.com/watch?v=OF0TFBQKCSY

videodaki opensource comport component ın linki
https://sourceforge.net/projects/comport/files/
OnError diye bir event gördüm. Kodu incelersen fikir verebilir.

https://blogs.embarcadero.com/powerful- ... n-windows/
bu da usb için fikir verebilir
https://zachetpizza.ru/en/drives/progra ... tv-na.html
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen ertank »

aegean yazdı: 02 Nis 2022 03:16 Hata ileti resmi cok kucuk olmus ve okunmuyor
Application Error
exception EInOutError in module comtest.exe at 00241e76
Device read error
Proje DEBUG modunda iken F9 tuşu ile çalıştırarak hata alındığında Break butonunu kullanıp Sol üst kısımdaki call stack içinde hatanın sizin yazdığınız ünitelerden hangi satırda oluştuğunu tespit edip onun üzerinden sebebini anlamaya çalışabilirsiniz.

Hataya bakınca porta yazma/okuma yapılamaz halde iken işlem yapılmaya çalışılıyor gibi anlaşılıyor. Ancak kod içinde inceleme yaparak gerçekten böyle mi görmek gerekli.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen aegean »

ertank bey konu barkod okuyucu ve usb comport emulatör modunda calısıyor usb den comport a emule eden driver da wimdows 10 da windowsun default driveri o da usb portdan cihaz cıkarılınca kendini kapatıp device listden tamamen yok oluyor. Dolayısı ile programda acık durumda olan comport bir anda bilgisaayardan sökülmüş ve yok olmus etkisi yaratıyor, bu da programda acık olam comportun askıda kalmasına neden oluyor. Tam anlatamadım, baglı oldugu cihaz kayboluyor ve comport için girdi cıktı hatası veriyor aslında fziksel olarak porta bir sey yazılmıyor ama port acık oldugu surece aralarında haberlesme devam ediyor malunumuz. Ortadan kayboluncada bu hata ortaya cıkıyor. Bu hatayı almak normal ama bunu yakalayıp programın durmasına heden olan hata ekranının yok etmek lazım ben bu işlemi yapacak bir yol bulamadım. stackoverflow da bir yerde bu hatayı yakalamakiçin lowlevel koda ihtiyac var demiş bu konu ile daha önce karsılarmıs ve try blogu harıcınde hata yakalama konusunda tecrübesi olan arkadaslar varsa yardımcı olurlarmı diye foruma konuyu yazdım
Ama sizin dediğinizide deneyeceğim belki de ApdComPort componentinde bir yere belki ilave try blogu ile exception yakalamak mumkun olabilir belki benim aklıma gelmemişti. tesekkür ederim.
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen aegean »

freeman35 bey evet ApdComPort da da onerror onlineerror var ama onları denedim ne yazıkkı exeception nu yakalayamadılar. sadece madexcept yakaladı ama O da kendi menusunu ekrana getirip ne yapacagını sorma kousunda ısrarcı olunca ve o mesaj formunun ignore edip programı normal calıstırmaya devam et secimini beceremedigim için kullanamadım ne yazıkkı. Ama diğer verdiğiniz linkleri dikkatle inceleyeceğim tesekkür ederim
aegean
Üye
Mesajlar: 41
Kayıt: 24 Tem 2019 09:32

Re: Application Error Exception EInOutError Hatasını durdurmak

Mesaj gönderen aegean »

ertank bey Cok Cok tesekkur ederim. Verdiğiniz öneri ile programda hatanın nereden yükseltildigini buldum ve EInOutError hatasını yükselten satırlar tam da adpcomport componenetinin Adexcept.pas dosyasında imiş oraya bir istisna koyarak o error'u pas gecmesini sağladım ve artık sorunsuz calısıyor cok tesekkur ederim iyi çalısmalar.
Cevapla