ASCII Sayı üzerinde işlem yapmak

Başlatan isa_olcer, 18 Mart 2019, 18:43:12

isa_olcer

Yapacağım uygulamada RS232 üzerinden ASCII formatında 8 karekter geliyor. örnek; "AB52652K" ben içersin deki 5 basamaklı sayıyı ayırıp tam sayıya çevirerek üzerinde işlem yapıp LCD de göstermek istiyorum. atol() komutuyla tam sayıya çevirmede sorun yok fakat string ifade içersin den 5 basamaklı sayıyı çıkarma konusunda sorun yaşıyorum.

  int veri[8];  // rs232 den gelen veri
  int a,b,c,d,e; // Sayı basamakları
   
  gets(veri);

  a=((veri[6])-0x30); //ASCII dönüşümü yapılıyor
  b=((veri[5])-0x30);
  c=((veri[4])-0x30);
  d=((veri[3])-0x30);
  e=((veri[2])-0x30);


gokhangokcen

@isa_olcer üstad bir sürü yolu var.Sayıların/rakamların yerleri sabit ise dizi boyu standart ise "ABC12345dfg" örneğin 3 karakter harf 5 karakter sayı ve ardından 3 karakter harf gelmiş. 3. byte'tan 7. byte'a kadar olan kısımları işleme sokabilirsin. Bir diğer yöntem ise if ile değerlendirmeye sokabilirsin dizi değişkeni. Örneğin;

if(gelen[x]<58 && gelen[x]>47) {
//Bu kısımda sadece numaralar/rakamlar girer burada işleme alıp değerlendirebilirsin. 57 ve 48 ascii aralığı rakamlara aittir.
x++;

}

İster for-next döngüsünde oku keyif senin.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

quarko

Gelen veriyi parse ederken, maksimum karakter sayısı kadar bir döngüye sokup ilk rakamı bul, indeksini al ve döngüden çık. Sonrasında 5 basamaklı sayıyı alırsın zaten.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

kudretuzuner

Merhaba,
Yollanan yerden,istediğiniz baytları EXOR komutu ile karşılaştırıp eşitlenince istediğiniz işlemi yaptırabilirsiniz.Örneğin "5" rakkamını ayırmak istediğinize göre 5 rakkamının ascıı hex değeri hex'35' dir.

;*************
MOVLW B'00110101'
XORWF RCREG
BTFSS STATUS,2
GOTO -----------
GOTO -----------
;*************
Amatör

brandice5

int sayi = atol(&veri[2]);

isa_olcer

#5
Cevaplarınız için teşekkür ederim. Biraz araştırdım böyle bi yöntem buldum. memmove(x,y+2,6); y="AF572389KL" => x="572389"


#include <stdlib.h>
#include <string.h>

char veri;
char bilgi;
int32 sayi;

gets(veri);

memmove(bilgi,veri+2,6); //verinin ilk iki karakteri çıkartıp sonraki 6 karakteri bilgiye kopyalıyor.
  
sayi=atoi32(bilgi); //ASCII sayı değeri tam sayıya çevriliyor.

mufitsozen

Alıntı yapılan: isa_olcer - 19 Mart 2019, 15:48:48Cevaplarınız için teşekkür ederim. Biraz araştırdım böyle bi yöntem buldum. memmove(x,y+2,6); y="AF572389KL" => x="572389"


#include <stdlib.h>
#include <string.h>

char veri;
char bilgi;
int32 sayi;

gets(veri);

memmove(bilgi,veri+2,6); //verinin ilk iki karakteri çıkartıp sonraki 6 karakteri bilgiye kopyalıyor.
  
sayi=atoi32(bilgi); //ASCII sayı değeri tam sayıya çevriliyor.

bilgi ve veri TEK byte sakliyabiliyor, Eger bu degiskenleri kullanarak dizilerle islem yaparsaniz hafizadaki bilgileri bozacaksiniz. Programiniz duzgun calismaz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.