TypeError: ord() expected a character, but string of length 0 found Hatası

Merhaba hepinize kolay gelsin elimde çok basit 4 bytelık bir veri var bunu pyserial ile gönderip karşılığında tekrar 1 byte okuma yapmaya çalışıyorum. Bu sırada bana geri dönen byte’ı doğru alıp almadığımı kontrol ediyorum ancak hiç birşey geri dönmezse otomatik olarak başlıkta belirttiğim hatayı alıyorum. Ancak hiç birşeyin gelip gelmediğini de if ile kontrol etmek istiyorum. Aşağıda denediklerimi paylaşıyorum;

if (len(test) ==0):   
if (test==None):
if (test==0):
check=[]
check.append(test)
if (len(check) ==0):
if(test == "")

Bunların hiç biri işe yaramadı ve “Error in background function” başlıklı hata ekranı almaya devam ediyorum. Kendi kodumu paylaşıyorum yardımcı olursanız çok sevinirim.

            def baglantı_ctrl():
                test_data=[0x77, 0x01, 0xAA, 0x23]
                basari = Label(root4, text="")
                ser = serial.Serial(port.device, 300, serial.EIGHTBITS, serial.PARITY_NONE, 
                serial.STOPBITS_ONE, timeout=4)
                i = 0
                while i < 4:
                    ser.write(test_data[i:i + 1])
                    time.sleep(0.02)
                    i += 1
                check=[]
                test = ord(ser.read(1))
                check.append(test)
                if (test == test_data[3]) :
                    basari=Label(root4, text="          İşlem başarılı                ", bg="green")
                    basari.place(relx=0.47, rely=0.01)
                elif (test_crc != test_data[3]) or (len(check) ==  0):
                    basari = Label(root4, text="Bağlantı gerçekleşmedi   ", bg="red")
                    basari.place(relx=0.47, rely=0.01)

Merhaba, test'in tipi nedir? Bende serial yüklü olmadığı için kodu deneyemiyorum. Basit bir örnek paylaşır mısınız?

Muhtelif if’lere soktugun test'in degerini de yazar misin? print(len(test), repr(test), str(test))

Bu arada asagidaki kodu kullaniyorsan orada testleri yapmadan once ord'a sokuyorsun, hata da orada cikiyor.

1 Beğeni

Büyük ihtimalle bu b"" döndürdüğü için hata alıyorsunuz.

-test için değer karşı karttan bana dönüyor ve kodumun ilk if kısmında anlayacağınız üzere datamın son elemanının bana geri dönmesini bekliyorum
-ord() yapmadığım zaman görmek istediğim hex değeri gelmiyor açıkçası o nedenle ord() kullanıyorum
-type(test) yaptığımda bytes olduğunu gördüm

evet biliyorum sorumda tamda bu o hatayı if ile kontrol edip hiç bir data gelmediyse ekrana bağlantı gerçekleşmedi yazmaya çalışıyorum aslında ama ne geldiğini kontrol edebiliyorum, gelip gelmediğini kontrol edemiyorum

Tek yapmanız gereken ord’den önce bunun uzunluğunu kontrol etmek:

herhangi bir byte gelirse dediğiniz gibi sorunsuzca uzunluğunu kontrol edebildim ancak hiç bir byte geri dönmediği haliyle debug yaptığım zaman program ser.read(1)'den daha ileriye gitmiyor ne yazık ki bi alt satırları çalıştırmıyor bile dolayısıyla if ile hiç birşeyi kontrol edemiyorum “Error in background function” ekranını almaya devam ediyorum

Hatanın ve kodunuzun tamamını atar mısınız?

tabi ki kopyala yapıştır yaparken girintileri bazen takip edemiyorum olabildiğince okunaklı atmaya çalıştım ama herhangi bir girinti hatası varsa buna takılmayın kodum epeyce uzun size sormaya çalıştığım kısmının tamamı burası ana pencereden sonra açılan bir toplevel üzerinden bu işlemleri yapıyorum. aldığım hata ekranınıda paylaşıyorum

def baglantı_ctrl():
      test_data=[0x77, 0x01, 0xAA, 0x23]
      basari = Label(root4, text="")
      ser = serial.Serial(port.device, 300, serial.EIGHTBITS, serial.PARITY_NONE, 
      serial.STOPBITS_ONE, timeout=4)
      i = 0
      while i < 4:
             ser.write(test_data[i:i + 1])
             time.sleep(0.02)
             i += 1
       check=[]
       test = ser.read(1)
       check.append(test)
       kontrol=ord(test)
       if(len(check) != 0):
           if (kontrol == test_data[3]) :
               basari=Label(root4, text="          İşlem başarılı                ", bg="green")
               basari.place(relx=0.47, rely=0.01)
           else:
               basari = Label(root4, text="Bağlantı gerçekleşmedi   ", bg="red")
               basari.place(relx=0.47, rely=0.01)
       else:
             basari = Label(root4, text="Bağlantı gerçekleşmedi   ", bg="red")
             basari.place(relx=0.47, rely=0.01)
root4 = tk.Toplevel()
pgen = 240
pyuks = 175
ekrangen = root4.winfo_screenwidth()
ekranyuks = root4.winfo_screenheight()
x = (ekrangen - pgen) / 2
y = ((ekranyuks - pyuks) / 2) - 20
root4.geometry("%dx%d+%d+%d" % (pgen, pyuks, x, y))

root4.resizable(width=tk.FALSE, height=tk.FALSE)
root4.title("Test Ayarları")

baglantı = Button(root4, text=" Bağlantı Kontrol ", command= baglantı_ctrl)
baglantı.place(relx=0.0, rely=0.01)

Bu paylaştığım kodlar ilk butonum için yapmak istediklerim görmek istediğim aslında bu ekran ancak bunu sadece karşı taraftan yanlış bir byte geldğinde görebiliyorum;
Ekran Alıntıssı

Bu da benim hata ekranım ;

Ekran Alıntısı

Tamam işte, ser.read(1) fonksiyonundan dönen değeri ord fonksiyonuna vermeden önce uzunluğunu kontrol edeceksiniz.

renklendirmeyi nasıl öyle yaptınız kodunuzu atarken merak ettim

gerçekten hiç birşey yapmadım bu şekilde oldu sanırım girintilerimde hata vardır o nedenle böyle gözüküyordur

1 Beğeni

onu da denedim len(ser.read(1))'ten itibaren program zaten aşağı satırı işlemiyor bile, tavsiyenizi kod olarak paylaşmanız mümkün mü

üstelik hem içeriği hem uzunluğu kontrol etmek istiyorum sadece len(ser.read(1)) yaparsam sadece uzunluk değeri tutarım içeriği ord() fonksiyonu ile tekrar bakmam gerekir ama ikinci kez ord(ser.read(1)) yapamam 2 kere byte gelmiyor karşı taraftan bana

Dil algılanamadığı için Python’un sözdizimi ile alakası olmayan bir renklendirme kullanılıyor.


Niye ki?

Değişkene atayın:

data = ser.read(1)
if len(data) == 1:
    ... #mesaj var
else:
    ... # mesaj yok

tamam çözdüm uzunlukla kontrol etmekte aynı sıkıntıyı yaratıyor ancak ìf(test != b'') şeklinde kontrol yapmak mümkünmüş bilginiz olsun sizin de çok teşekkür ederim uğraşınız için

Bu mümkünse bu da mümkün olmalı:

if (len(test) != 0)

Önerinizi çalıştırmayı denediniz mi o zaman sanırım ben gözden birşey kaçırıyorum çıktınızı atarsanız çok sevinirim bende öğrenmiş olurum

>>> test = b""
>>> if (len(test) != 0): print("boş değil")
... else: print("boş")
...
boş
>>>