Basit windows programi yazmak istiyorum.

Donanıma özel bir yazılım yaptım. herşeyini yayınladım. Donanım olmadan hiç bir işe yaramayan bir program. Yani program donanıma hizmet ediyor... Bu durumda açık kaynak olmasında çokta bir sıkıntı yok...:dans1:
 
Şimdi şöyle bir derdim var.

Elimde birkaç tane binary dosya var. Bu dosyları bilgisayardan mcu ya, mcu dan da başka bir sisteme (Niyahi alıcı) göndermem gerekiyor.

Elimde bu iş ile ilgili protokoller var o konuda bir sıkıntı yok.

Temel mantık söyle der;

1. veriyi en fazla 256kb lık paketler şeklinde gönder.
2. her paketin başına header, paket boyutu, ve komut ekle sonra veriyi gönder ama herşey dahil 256 yı aşma...
3. her paket gittikten sonra yeni paket için cevap gelecek... sonra yeni paket gönderilecek. vs...

Headerı vs atalım olayı basitleştirelim. Ne kadar veri + veri şeklinde bir yapı olsun.

ham verimiz 300byte olsun.

255 (byte veri) + 255(byte ham veri) = 256byte (1. paket)
45(byte veri) + 45 (byte ham veri) = 46byte (2. paket)

Hex düşünecek olursak brinci paket 255 veri içeriği için FF ile ikinci paket 2D ile başlayacak.
FF XX XX XX XX ...... XX
2D XX .... XX

Şimdi binary datayı paketleme işini bilgisayar yazılımına yaptırcağım ki mcu ya çok iş düşmesin. MCU al ver yapacak bu nedenle o tarafa şu anda çok kafa yormuyorum.


python ile bir iki deneme yaparak dosyadan binary okuma, hexe çevirme, ascii görüntüleme olaylarını çözdüm. Bu python da { açmayınca bir tuhaf geliyor :)

Nasıl bir algoritma kurayım diye kafam karışmıştı onuda galiba yazarken çözdüm. :)

Önce toplam boyutu tespit edip son paketteki veri miktarını göz önünde bulundurmalıyım.
sonra iç içe koşullu iki döngü ile bu işi halledebilirim sanırım.

Tamam sorum yok. Boşuna okudunuz. :D
 
Yine bir yerde takıldım... Bakıyım yazarken aklıma bir şey gelecek mi :)

Klasör içerisindeki dosyala adlarının uygunluğunu kontrol etmem gerekiyor.

Kurallar şöyle. Her dosya adı 10 ile 30 arasında rakam ile başlamak zorunda.

Örnek dosya adı : 11.txt uygun.
Örnek dosya adı : 12Veli.txt ilk iki karakter rakam uygun.

Buraya kadar sıkıntım yok.

Aynı dosyadan iki adet var ise sorun oluyor.

11_ali.txt uygun...
11.txt uygun...

ancak ikisi aynı anda olamaz.

11_ali.txt uygun...
11.veli.txt uygun...

yine ikisi aynı anda olamaz.

3-4 tane 11 ile başlayan var ise hiç hiç olamaz. :)

hımm yazdım, aklıma basit birşey gelmedi...

Varmı basit bir yolu? Nasıl bir algoritma olur..?
 
Yine bir yerde takıldım... Bakıyım yazarken aklıma bir şey gelecek mi :)

Klasör içerisindeki dosyala adlarının uygunluğunu kontrol etmem gerekiyor.

Kurallar şöyle. Her dosya adı 10 ile 30 arasında rakam ile başlamak zorunda.

Örnek dosya adı : 11.txt uygun.
Örnek dosya adı : 12Veli.txt ilk iki karakter rakam uygun.

Buraya kadar sıkıntım yok.

Aynı dosyadan iki adet var ise sorun oluyor.

11_ali.txt uygun...
11.txt uygun...

ancak ikisi aynı anda olamaz.

11_ali.txt uygun...
11.veli.txt uygun...

yine ikisi aynı anda olamaz.

3-4 tane 11 ile başlayan var ise hiç hiç olamaz. :)

hımm yazdım, aklıma basit birşey gelmedi...

Varmı basit bir yolu? Nasıl bir algoritma olur..?
Ürettiğin rakamları bir yerde toplayacaksın.
Rakam üretirken bu yerde arama yapıp aynısından varsa başka ürettireceksin. Random Unique olarak aratırsan benden daha mantıklı cevaplar bulabilirsin :D
 
Rakamları ben üretmiyorum. Onları kullanıcı verecek. Sadece yanlış adlandırma var ise tespit etmem lazım ki onuda çözdüm...

Python:
bin_dosyalar=[]    # potansiyel dosyalar için boş dizi oluştur.

for Dosya_bin in os.listdir('./upload'):   #dosya varmı bak.
  
      
        if (Dosya_bin[0:2].isdigit()==False):  #dosya adı ilk iki karakter rakam değil ise
            print("UYARI!!! Bin Dosya adlarının ilk iki karakteri Rakam olmalıdır. Dosya adını kontrol edin...")
            print("İlgili Dosya :")
            print(Dosya_bin)
            quit()


    
        # dosyalar dizisi boyunca döngü oluştur yeni elemanı mevcut olanlar ile kontrol et...
        for mevcut_dosya in bin_dosyalar:
            if (mevcut_dosya[0:2]) == (Dosya_bin[0:2]):
                print("UYARI!!! Aynı rakam ile başlayan birden çok Bin dosyası kullanılamaz. Dosya adlarını kontrol edin...")
                print("İlgili Dosyalar :")
                print(aktif_dosya)
                print(Dosya_bin)
                quit()
                  
        #sorun yoksa yeni dosya adını diziye ekle                 
        bin_dosyalar.append(Dosya_bin)
 
for döngüsünü böyle kullanmak ne kadar kolaymış... Ptyhona özel bir durum mu ondan haberim ancak normalde bana kalsa dizinin eleman sayısını tespit eder o değere göre döngü kurardım. şimdi hiç gerek yok...
 
Ben olsam regexp kullanırım. İsmi iki ayrı bileşene ayırıp analiz edebilirsin:

Python:
#!/usr/bin/python

import re

fname = "23jiosdfwsd.txt"

m = re.match("([1-3][0-9])(.*)", fname);

if m != None:
    print("Buldum");
    print("Rakamli: (" + m.group(1) + ") geri kalan (" + m.group(2) + ")");
else:
    print("Bulamadim");
 
Programımı terminalden çalışacak şekilde yazdım.

seri port üzerinden 115200bps hızında veri transfer ediyorum.

Şöyle bir test yaptım.

807.492 byte veri gönderdim.

807.492 x 8 = 6.459.936 bit yapar.

6.459.936 / 115.200 = 57 Saniye Hesaplıyorum. Bu en ideal değer.

Üreticinin programını veriyi 80 saniyede transfer etti.

Benim program. 160 saniyede transfer etti.

bir seferde enfazla 240 byte gönderebiliyorum. Bu nedenle bu verinin transferi için 3.376 defa paket gönderdim.

Her paketi gönderdikten sonra karşıya ulaşıtığını doğruluyorum. Buda bir zaman kaybına yol açıyor. doğrulama için 18ms altına inemedim.

3.376 x 0.018 = 61 saniye zaten burdan gecikme yiyorum.

bu gecikmeden kurtulursam 100 saniyeye inerim. üretici 80 saniyede yapıyordu. Eh o zaman amaca göre benimki de fena sayılmaz hale gelir.

Nasıl yaparım derken aklıma gelen şey doğrulamayı bir paket geriden yapmak. 1. paket gidecek sonra 2. gidecek sonra 1. paketin gittiği bufferdan okunacak... :cheeky2:

hımm o zaman ilk paket için doğrulamayı yapmayacam. Ama serial i aç kapa yapınca bufferda veri dururmu ki.. durmaz ise bağlantı da sürekli açık kalmalı.... :dusun1:


Python:
def send_data_uart(uart,data):
    answer = b'\x5A\xA5\x03\x82\x4F\x4B'
    status=False
    try:
        ser_connect = serial.Serial(uart[0],baudrate=uart[1],timeout=0) 
        #ser_connect.flushInput()
        #ser_connect.flushOutput()
        ser_connect.write(data)
        time.sleep(0.018)
        reply=ser_connect.read(6)
        if reply == answer:
            print("DATA TRANSFER SUCCESS...\n")
            status=True
            return status
        else:
            print("DATA TRANSFER FAIL...")
        return status     
        ser_connect.close()
    except:
        print("CONNECTION FAIL...")
        return status
        quit()
 
Niye her paketi doğruluyorsun? Gönder hepsini en sonunda de CRC karşılaştırması yap. Neticede kablo ile birbirine bağlı iki cihazdan bahsediyoruz, hata olma olasılığı çok düşük.
 
Bilmem hiç düşünmedim. Sağlam olsun diye heralde. her paketi gönderdiğimde karşısı otomatik cevap gönderiyor. CRC hiç kullanmadım nasıl hesaplandığını öğrenmek zor geldi :) Cihazda her paket için crc desteği var ama varsayılan olarak kapalı. Bunu kullansam sadece paket başına doğrulama yapar. Karşıda tarafta başka bir şey yapamıyorum.sadece rami okuayabilirim oda 32kb ile sınırlı... Tüm veriyi crc ile karşılaştıramam sanırım.

şimdi karşı cihaz için şöyle bir bilgi var. " refresh period is 20ms" bundan şöyle bir anlam çıkarsam 20ms den önce başka bir yapamam...

gönderdiğim paketleri ram e yerleştirmesi 3.376 x 0.02= 68saniye yapar. Eee bu bilgiden ne anladım 68 saniye de hem 3.376 defa ram e yazdı hemde bana cevap gönderdi... Bir işime yaramadı...

Adam 80 saniyede nasıl gönderiyor acaba... gelen bilgiyi hiç okumadan arka arkaya mı yolluyor paketleri...
Şu seri port için başka bir fonkisyon yazmayı deneyeyim bakayım olacak mı...
 
Aslında doğruluyorum ifadesi yanlış. Daha doğru ifade karşı tarafın ikinci paket için müsait olduğundan emin oluyorum. Yoksa veri doğrulanmıyor.
 
Doğrulama eğer bir sonraki komutu almaya hazır olması ise, ve her komutta da en fazla 240 byte veri gönderebiliyorsan o zaman üreticinin yazılımı belki kodu sıkıştırarak gönderiyor ve cihaz bunu açıp öyle yerine yazıyordur. Onun dışında belki de üreticinin yazılımı herkese açıklanmayan dahili bir API kullanıyordur ve bu API ile daha büyük paketler gönderilebiliyordur.
 
Python ve C program arasında bir hız farkı olur ama bu kadar bariz bir fark olmaz. C olan belki %5, %10 daha hızlı olur.
 
110 saniyeye düştüm. Buna eyvallah diyecem :)

20ms refresh time diye beni neden uyardığını şimdi anladım.

240byte x 8 =1.920bit

1.920 / 115200 = 16.6ms eder.

20 ms dolmadan 2. paketi gönderme demek istiyor. şöyle yaptım. gelen cevabı okumadan paketi gönderdikten sonra 3ms delay ekledim. bu saniyede 110 ms ye düştüm. herhangi bir doğrulama yok. Doğrulama benim bakıyorum olmuş :)

arada kod gecikmeleri de var belki 3ms delay eklemesemde olur ama bu seferde olay çok kontrolsüz olabilir. Bu nedenle böyle iyi...
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,955
Mesajlar
118,784
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top