Seri com portun sürekli kontrol edilmesi

merhaba program devam ederken sürekli olarak bağlandığım com port ile bağlantının kesilip kesilmediğini 1 saniyelik ara ile kontrol etmek istiyorum gömülü sistemlerde ki timer interrupt gibi. Programım eğer veri transferi sırasında bağlantı koparsa hata veriyor ancak ben hiç bir şey yapılmadan sadece program açıkken bile port bağlantısı koparsa kullanıcıya bildirmek istiyorum. bunun için şu kodu kullanıyorum ancak bağlantıyı kendim kessem bile ekrana açık yazmaya devam ediyor sanırım doğru yol ser.isOpen değil. Bir fikri olan var mı

def SerailPort_Control(self):
       while True:
           if self.ser.isOpen() == True:
               print("açık")

           time.sleep(1)
...
Thread(target=self.SerailPort_Control).start()

import time

while True:
    time.sleep(1)
    kodlarınız

aynı işlemi yapacaklardır

doğru ama başka bir yolunu bulamadım galiba yok

Eğer veri alamassak kapalı olacaktır

def SerailPort_Control(self):
       while True:
           if self.ser.isOpen() == True:
               print("açık")
               try:

                   self.ser.getveri()#komutu bilmiyorum veri çekecek
               except:
                   print("kapalı")
                   self.ser.close()

           time.sleep(1)

Bu fonksiyonun dökümanına bakın.

1 Beğeni

Seri port baglantisinin kopmasindan/kesilmesinden kasit nedir?

manuel olarak çekip çıkarttığınızda mesela doğrudan uyarı verilsin istiyorum herhangi bir UART datası yollamadan veya almadan

Neyi manuel olarak cekip cikarttigimizda?

neden anlaşamadığımızı anlayamıyorum şu an ama bilgisayırımın usb girişinde bir kablo takılı bu da bir IR dönüştürücü kartına gidiyor. Bu bağlı olan usb’yi çekersem program açıkken sormak istediğim bu daha nasıl anlatabileceğimi bilmiyorum

“Bilgisayarima bagli seri port USB dongle’i” demek yerine bir yazilim konsepti olan “seri port” ve Windows’da dosya ismi olan “COM” dedigin icin. Soylediklerinin ikisi de cekilebilen, cikartilabilen seyler degil. Bilgisayarina seri port hizmeti veren her sey cikartilabilir de degil. Seri portun kullanim amaci baska bir cihazla haberlesmek, ve bilgisayar–seri port baglantisina dokunmadan cihazi seri porttan cikartmak da mumkun.

Fiziksel kisim icin bu kadari yeterli. Bilgisayar kisminda; PC olup olmadigini, isletim sisteminin ne oldugunu, bir de seri port kutuphanesinin ne oldugunu soylemen yeter diye tahmin ediyorum.

Ama genel olarak guzel bir yolu yok. Cogu kisi seri port dosyasinin olup olmadigina bakiyor ama bu isletim sistemine bagli olarak mumkun olmayabilir.

Bilmiyordum benim hatam olmuş kusura bakmayın. Veri transferi sırasında çekersem
SerialException: could not open port {COM5}: PermissionError(13, 'Erişim engellendi.', None, 5)
gibi bir hata alıyorum yani anladığım kadarıyla ser.write() yada ser.read()'e bağlı herhangi bir işlem yaptığımda seri portun hala kullanılabilir olduğunu yada olmadığını anlayabiliyorum. Programın başka herhangi bir yerinde değil. Doğru mu anladım?

1 Beğeni

Kullanilan kutuphanede bunu yapmak icin bir fonksiyon veya tavsiye edilen bir yontem yoksa saglikli / kolay bir yolu olmayabilir.

Port listesini cekip kullanilan portun hala icinde olup olmadigina bakanlar var (ben Linux’ta oyle yapiyorum), Windows’ta ise yariyor mu?

Bu arada seri port–cihaz arasi iletisim deseydiniz iki pinle imkani yok, RTS/CTS varsa belki, DCD/DSR varsa muhtemelen, diyecektim.

Port listesini böyle çekiyorum olmaı gereken bu mu emin değilim ;

def scanning_ports(self):
        self.ports = serial.tools.list_ports.comports()
        self.available_ports = [port.device for port in self.ports]
        return self.available_ports

windows kullanıyorum söylediğiniz şey mantıklı deneyeceğim teşekkür ederim geri dönüşleriniz için