Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: isa_olcer - 18 Mart 2019, 18:43:12

Başlık: ASCII Sayı üzerinde işlem yapmak
Gönderen: isa_olcer - 18 Mart 2019, 18:43:12
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);

Başlık: Ynt: ASCII Sayı üzerinde işlem yapmak
Gönderen: gokhangokcen - 19 Mart 2019, 10:57:31
@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.
Başlık: Ynt: ASCII Sayı üzerinde işlem yapmak
Gönderen: quarko - 19 Mart 2019, 11:31:14
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.
Başlık: Ynt: ASCII Sayı üzerinde işlem yapmak
Gönderen: kudretuzuner - 19 Mart 2019, 12:23:34
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 -----------
;*************
Başlık: Ynt: ASCII Sayı üzerinde işlem yapmak
Gönderen: brandice5 - 19 Mart 2019, 13:16:06
int sayi = atol(&veri[2]);
Başlık: Ynt: ASCII Sayı üzerinde işlem yapmak
Gönderen: isa_olcer - 19 Mart 2019, 15:48:48
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.
Başlık: Ynt: ASCII Sayı üzerinde işlem yapmak
Gönderen: mufitsozen - 19 Mart 2019, 20:33:20
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.