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);
@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.
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.
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 -----------
;*************
int sayi = atol(&veri[2]);
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.
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.