Comport'tan gelen veriyi string'e çevirmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

Merhaba

ZySerialPort componentini kullanarak cihazın gönderdiği veriyi
ASCII
Decimal
Hexa
türünde alıyorum.Ama bu veriyi stringe nasıl çeviririm.Daha önce port üzerinde çalışmadım.
Nereden başlayacağım konusunda bi tavsiyede bulunur musunuz?

ASCII olarak gelen veriyi Ord komutuyla çevirmeye çalıştım
Ama göreceğiniz üzere rakamsal bir ifade olmadığı için çeviremedim.
Aşağıda gelen verileri Char olarak mı çevirmeliyim.

Normalde Kullanıcın göreceği bilgi:
Fe 12,65
Al 8,55
...
...

Gelen veri ASCII olarak:

Kod: Tümünü seç

‚°±³®¶ 
°±²®³ °±²®µ °°°®° °±²®³ °±±®· 
°±±®¶ °±¸®± °±¶®³ °±³®± °±±®³ 
°°·®³ °±°®· °°¹®µ °±±®³ °±°®³ 
°±°®µ °°·®· °±´®² °±°®¹Š
Gelen veri Decimal olarak:

Kod: Tümünü seç

130
17617717917418116017617717817
41771601761771781741811601761
76176174176160
17617717817417916017617717717
41831601761771771741811601761
77184174177160176177182174178
160
17617717917417716017617717717
41791601761761831741791601761
77176174183160176176185174181
160
17617717717417816017617717617
41791601761771761741811601761
76183174183160176177180174177
160
176177176174185141138
Gelen Veri Hexa olarak:

Kod: Tümünü seç

82
B0B1B3AEB5A0B0B1B2AEB1A0B0B
1B2AEB5A0
B0B0B0AEB0A0B0B1B2AEB2A0B0B
1B1AEB5A0B0B1B1AEB5A0B0B1B7
AEB9A0
B0B1B6AEB1A0B0B1B2AEB9A0B0B
1B1AEB1A0B0B0B7AEB2A0B0B1B0
AEB5A0
B0B0B9AEB3A0B0B1B1AEB1A0B0B
1B0AEB2A0B0B1B0AEB5A0B0B0B7
AEB6A0
B0B1B4AEB1A0B0B1B0AEB78D8A
Componentin demosunda gelen veriler şu şekilde okunuyor:

Kod: Tümünü seç

procedure TMainForm.ZylSerialPortReceive(Sender: TObject; Buffer: AnsiString);
var
  strBuffer: AnsiString;
  i: Integer;
begin
  if rgMode.ItemIndex = 0 then  //ASCII olarak
    Memo.Lines.Add(ZylSerialPort.ReplaceControlChars(Buffer))
  else if rgMode.ItemIndex = 1 then  //Decimal olarak
  begin
    strBuffer := '';
    for i := 1 to Length(Buffer) do
      strBuffer := strBuffer + IntToStr(Ord(Buffer[i]));
    Memo.Lines.Add(strBuffer)
  end
  else
  begin   //Hexa olarak
    strBuffer := '';
    for i := 1 to Length(Buffer) do
      strBuffer := strBuffer + IntToHex(Ord(Buffer[i]), 1);
    Memo.Lines.Add(strBuffer)
  end;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen freeman35 »

.... Buffer: AnsiString);
Veri sana zaten string olarak geliyor.
"Memo.Lines.Add(strBuffer)" Add() function zaten in parameter olarak string kabul eder.
sen sorunu yanlış yerde arıyorsun gibi. Sana gelen verinin ne olduğunu biliyor musun? yani comm üzerinden sana gelen bilgi ne? Cihazlar uzun cümleler göndermezler genelde, karakter combinasyonu gönderirler, bu hem chip içinde yer tutmaz, hemde iletişimde gereksiz yük bindirmez.
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 !!!
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

Gelen veri ASCII yada string olarak:

Kod: Tümünü seç

‚°±³®¶ 
°±²®³ °±²®µ °°°®° °±²®³ °±±®· 
°±±®¶ °±¸®± °±¶®³ °±³®± °±±®³ 
°°·®³ °±°®· °°¹®µ °±±®³ °±°®³ 
°±°®µ °°·®· °±´®² °±°®¹Š
Sayın Freeman

Kod: Tümünü seç

memo.lines.add (Buffer)
Yaptığımda da yine yukaridaki anlamsız veriyi görüyorum.
Gelen veriyi ASCII olarak göster dediğimde görünen veri ile string olarak eklediğim veri aynı gözüküyor.
Bu veriler ASCII tablosunda görünen semboller.Ama orijinal Xp üzerinde MSDos programını
çalıştırdığımızda anlamlı string verileri görüyorum.

MSDos programıyla çalıştırdığımızda:
Al 2,35
Fe 1,25
...
şeklinde verileri görebiliyorum.
speed60
Üye
Mesajlar: 53
Kayıt: 07 Eki 2011 08:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen speed60 »

port un baud hızlarını değiştirerek denedinizmi

https://drive.google.com/file/d/0B_kXb4 ... sp=sharing
birde bu proğramla denermisin
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

İlginiz için teşekkürler speed60.
Cihazın orijinal programı 2400 baundrate hızında çalışıyor.O yüzden hızı değiştirmek aklıma gelmedi.
Denerim.
Linkini verdiğiniz programı da indirdim.Yarın deneyip sonucu bildiririm.

Kullandığım ZylSerialport componenti çalıştığında demo diye hata veriyor.Acaba bununla ilgili olabilir mi aklıma takıldı.
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

speed60 yazdı:port un baud hızlarını değiştirerek denedinizmi

https://drive.google.com/file/d/0B_kXb4 ... sp=sharing
birde bu proğramla denermisin
dediğiniz component ile de denedim sonuç yine aynı sadece semboller geliyor.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen freeman35 »

Tahmin yürütebilirim zadece, AnsiString ile Unicode farklılığı olabilir, yani chip lerde gereksiz yere unicode kullanılmaz.
Diğer taraftanda, "ZylSerialPortReceive" buraya gelen bilgiyi sen parse edip, sonuca göre işlem yaptırtacaksan, senin ekrana bastığın bilginin bir önemi yok, yani atıyorum, Dos ta ekrana yazıyor dediğin "Al 2,35" delphi de ekrana "°±³®¶" şeklinde basıyor diye sen buna yanlış deme bence. Bu bilgiye göre hangi işlemi yaptıracaksan, mesela ekranda bir panelin rengini kırmızı yapacaksan yapabilirsin. Demem oki kullanıcı gelen bilgiyi okumak zorunda değilse cihazdan gelecek bilgi seti sabittir, yani chip ten 1. sensor tetklendiğinde alacağın bilgi hep aynıdır.
birde speed60 ın dediği gibi comm parametre leride önemli. sadece baudrate değil stopbit parity vs. ayrıca denemeler vs yapıyorsan usbToComm çeviricileri kullanmamanı öneririm. sonuçta hepsi hakiki cin malı :)
Kolay gele
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 !!!
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

Sayın freeman
UsbToComm çevirici kullanmıyorum.Laptopda seri port çıkışı var.
Ben gelen verileri anlayabilsem kullanıcıya istediğim gibi gösterebilirim.

Başka component ve hazır seri port programlarını da kullandım gelen veri yine aynı.
Değişik baudrate hızlarını da denedim sonuç aynı.

Zaten Msdos programı da en başta baudrate hızınızı Bios üzerinde 2400 olarak ayarlanması konusunda uyarı veriyor.
Hayret ettiğim şey gelen verinin içinde hiç rakam yok.Bu durumda Msdos programı neye göre bu rakamları gösteriyor.

Gelen veri için de metal isimleri ve ölçüm rakamlarının handisi olduğunu anlayabilsem sorunumu çözebilirim.

speed60 ın linkini verdiğiprog ile aldığım veri ise şöyle:

Kod: Tümünü seç

‚
±¶°®¹ 
°¸±®· 
°¶°®µ 
°°°®° 
°¹·®± 
±±·®¹ 
°¹²®± 
²¹²®³ 
²±´®¹ 
°µ¹®² 
±¶¹®¹ 
±°·®µ 
±´¸®² 
°°¸®¹ 
°±°®¹ 
°³´®· 
°¶±®µ 
°°°®° 
°°¶®¹ 
°±±®µŠ
82 
B1 B6 B0 AE B7 A0 
B0 B8 B1 AE B5 A0 
B0 B6 B0 AE B3 A0 
B0 B0 B0 AE B0 A0 
B0 B9 B6 AE B9 A0 
B1 B1 B7 AE B7 A0 
B0 B9 B2 AE B1 A0 
B2 B9 B1 AE B9 A0 
B2 B1 B4 AE B5 A0 
B0 B5 B9 AE B1 A0 
B1 B6 B9 AE B5 A0 
B1 B0 B7 AE B3 A0 
B1 B4 B7 AE B9 A0 
B0 B0 B8 AE B7 A0 
B0 B1 B0 AE B9 A0 
B0 B3 B4 AE B7 A0 
B0 B6 B1 AE B5 A0 
B0 B0 B0 AE B0 A0 
B0 B0 B6 AE B7 A0 
B0 B1 B1 AE B5 8D 8A 
130 
177 182 176 174 181 160 
176 184 177 174 179 160 
176 182 176 174 177 160 
176 176 176 174 176 160 
176 185 182 174 183 160 
177 177 183 174 181 160 
176 185 177 174 185 160 
178 185 177 174 181 160 
178 177 180 174 179 160 
176 181 184 174 185 160 
177 182 185 174 179 160 
177 176 183 174 177 160 
177 180 183 174 183 160 
176 176 184 174 183 160 
176 177 176 174 183 160 
176 179 180 174 181 160 
176 182 177 174 179 160 
176 176 176 174 176 160 
176 176 182 174 183 160 
176 177 177 174 181 141 138 
Burada veriler biraz daha anlamlı ama normalde 12 adet metal bilgisi gelmesi gerekirken.
Daha fazla satır var.Her satırın bir metali temsil ettiğini düşünüyorum ama satır sayısı da fazla.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen mrmarman »

Hocam @freeman35'i destekleyen bir şey yazıcam, bunu takip edemediğini değerlendirdiğimden yazıyorum yanılıyorsam kusura bakma.

Protokol konusundan bahisle şunu denersen daha iyi anlayacaksınız diye düşünüyorum.
DOS mode projeniz ile okuduğunuz verinin WINDOWS mode şimdiki projeniz ile okuduğunuz karşılıklarını bir yere not edin.
Sonra belki de

Kod: Tümünü seç

°±³®¶
değerindeki
1. ( ° ) karakteri separator yani değerler arasındaki ayracı ifade ediyor olduğunu,
2. ( ± ) ifadesi ( Al ) değerini
3. ( ³®¶ ) ise sonucu big-endian veya benzeri bir formatta sonucu ifade ediyor
...olduğunu göreceksiniz.

Bu işte protokol dediğimiz, mimimum veri trafiği ile maksimum sonuç iletmek için araç oluyor.

Sayının fazla veya az olması illa ki metala ilişkin olduğuna değil, protokol handshake kısmı tarih ve raporlama kısımlarına işaret ediyor olabilir. Onun için bu satırları yazma gereği duydum
Resim
Resim ....Resim
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

Muharrem Bey

Dos programında gelen veriyi paketini göremiyorum.program sadece son kullanıcıya
metallerin kodlarını (Fe,Al vb.) ve miktarını (misal 2,05) gösteriyor.
Acaba bu dos programının exe sini açmaya çalışsam , gelen veriyi nasıl parse ettiklerini öğrenebilir miyim?

Nihayetinde çok eski bir program exe sini internette gezen programlar ile açabilirim diye düşünüyorum.

Bahsettiğinis big - endian formatı gibi formatlar konusunda bilgim yok.O konuyuda hemen araştırayım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen mrmarman »

Cihazın marka ve modelinden yola çıkarak internette daha önce protokolü yayınlanmış mı ona bakarak başlayabilirsiniz.
Cihaz çıkışa test verisi yollayabiliyorsa onunla da kontrollü bir karşılaştırma yapabilirsiniz. Cihaz üzerinde hafıza varsa oradaki değişik verilerin sonuçlarındaki değişimi tablolaştırıp tümden gelim de yapabilirsiniz.

BIGENDIAN gibi float tipi yapısı DOS ortamında vardı. UNSIGNED yapıda noktalama imi vermek imkanı vardır. Olabilirliği yönünde fikir beyan ettim, şu an sizin için ikinci planda olmalı. Öncelik metallerin nasıl ifade edildiğidir.
Resim
Şunu yapmalısınız, metalleri doğru yerlerden ayırıp aynı sıra ile gösterebiliyor olmalısınız. Sonra her bir metal veri bloğundaki değerleri deşifre işlemine geçebilirsiniz.

Stratejinizi bu şekilde planlı kurarsanız çok fazla vakit kaybetmeden sonuca ulaşabileceğinizi değerlendiriyorum.
Resim
Resim ....Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen freeman35 »

"Başka component ve hazır seri port programlarını da kullandım gelen veri yine aynı."
Benim dediğimi test edip onaylamışsın sende :) port una gelen bilgide sıkıntı yok, göstermede font lardan yada unicode dan kaynaklı sıkıntı var. Muharrem bey anlatmaya çalıştığımı biraz daha detaylı şekilde anlatmış. Cihazın mutlaka bir sdk sı vardır yada üreticisine ulaşırsanız mutlaka result set i vereceklerdir.
Birde şu var, yukarıda verdiğiniz kod nerden ? yani bu cihazla verilen bir demo mu? "rgMode.ItemIndex" bu property neye göre set ediliyor? intiger değere ascii muamelesi yaparsanda sonuç anlamsız gelir. Sen denediğine göre comm a gelen bilgide sorun yok, okumandada sorun yok. Sadece gelen bilginin cinsine göre işlem yapman gerekiyor. Gelen Ansistring, yani array gibi düşünebilirsin ki array gibi işlem de yapabilirsin, her bir boyut, hücre yada karakter(ben boyut kelimesine alıştım) ascii tablodan bir değerdir. Rakkamlarda direk rakkam olarak gönderildiyse buda ascii tabloda klavye karakteri olmayan bir sayıya denk gelebilir, bunu ekrana basmaya kalkarsan anlamsık şekiller çıkabilir, windows kısmında işin içine birde font giriyor.
Gelen ansistring i incele bence, hiç bir işlem yapmadan, onun çözerek sonuca ulaşabilirsin sanırım.
Kolay gele
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 !!!
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Re: Comport'tan gelen veriyi string'e çevirmek

Mesaj gönderen kahraman1285 »

İlginiz için gerçekten teşekkürler.Üretici firmaya ulaşabileceğimi sanımıyorum ama deneyeceğim.
Çünkü cihaz çok eski.

Win 7'ye Ms Dos fontu yükledim.
http://www.dafont.com/perfect-dos-vga-437.font
Bu font ile gelen veriyi notepad yapıştırıp dos fontu olarak göster deyince karşıma şöyle bir şey çıktı.

Resim

Ms dos karakter setinin farklı olduğunu düşünerek google ms dos font diye aratınca karşıma şu çıktı
http://thestarman.narod.ru/tool/pfe/PFE32.htm
Burada en alttaki resim
Resim

Gelen veri ile sembolü eşleştirme yapmak mı gerekiyor .Ben mi yanlış anlıyorum bilmiyorum.Burada X Y ekseninde kesişen sembol
bir sayıya mı denk geliyor.Acaba gelen veri içindeki sembollerin sayı karşılığını bu tabloya göre mi bakacağız.

Yoksa sahur yapmadığım için daha bu saatte açlık başıma mı vurdu. :lol:
Cevapla