gsm projesinde 2 değişkeni karşılaştırma sorunu

Başlatan dnaci, 15 Ocak 2017, 19:29:46

dnaci

PIC16f887 ile bir g510 gsm projesi üzerinde gerçek devre ile çalışıyorum. Her şey yolunda aşağıdaki kod satırları ile sms analizi yapıp numarayı tespit edip mesajdan istediğim yeri seçip röleleri on off yapabiliyorum. Sms atan numarayı ve değişkenleri LCD üzerinde görebiliyorum. Tabi böyle bir sistemde şifre kullanmak gerekir. Bu amaçla kayıtlı şifre HAFIZA ile sms'ten gelen MESAJ değişkenlerini karşılaştırmam ve ona göre işleme onay vermem gerekiyor. Sorun da burada başladı. İki değişkeni karşılaştıramıyorum. For next ile bir döngü yazdım ancak bir türlü karşılaştıramıyorum. Hafızadaki 1-2-3-4-5-6- ve smsten gelen datalar 1-2-3-4-5-6 şeklinde birebir ancak sürekli yanlış şifre hatası alıyorum. Kaçırdığım bir şey mi var göremediğim bir ince ayrıntı var galiba.

Değişkenler şu şekilde:
MESAJ VAR BYTE[5]     
GSMNO VAR BYTE[13]     
HAFIZA VAR BYTE[5]
SAY VAR BYTE   
SYMBOL  ROLE1 = PORTB.0

HSERIN 5000,MLIST,[WAIT("REC UNREAD"),skip 3,str GSMNO\13, skip 29,STR MESAJ\13]
Lcdout $fe, 1
PAUSE 100
HSEROUT [26]
Lcdout "KONTROL NO:"
Lcdout $FE, $c0,GSMNO[0],GSMNO[1],GSMNO[2],GSMNO[3],GSMNO[4],GSMNO[5],GSMNO[6],GSMNO[7],GSMNO[8],GSMNO[9],GSMNO[10],GSMNO[11],GSMNO[12]
pause 1000

Lcdout $fe, 1
PAUSE 50

HAFIZA[0]=1
HAFIZA[1]=2
HAFIZA[2]=3
HAFIZA[3]=4
HAFIZA[4]=5
HAFIZA[5]=6

pause 500
Lcdout $fe, 1
Lcdout " KOMUT MESAJI:"

Lcdout $FE, $c0,#HAFIZA[0],#HAFIZA[1],#HAFIZA[2],#HAFIZA[3],#HAFIZA[4],#HAFIZA[5],MESAJ[0],MESAJ[1],MESAJ[2],MESAJ[3],MESAJ[4],MESAJ[5]
pause 1500

SIFRE_KONTROL:
FOR  SAY=0 TO 5
    IF HAFIZA[SAY] <> MESAJ[SAY] THEN  'burada  !=  denedim sonuç değişmedi
       LCDOUT $FE,$80,"SIFRE YANLIS"
       pause 800
       GOTO MESAJ_DELETE
   ENDIF
       NEXT SAY
       HIGH ROLE1
       GOTO SEND_SMS1     
RETURN
   

ete

Sorunun kaynağı muhtemelen Değişken tanımlamaların.
HAFIZA VAR BYTE[5] şeklinde tanımlama 5 adet dizi değişkeni tanımladığını gösterir. Bunun açılımı ise şöyledir.
Hafıza[0]-Hafıza[1]-Hafıza[2]-Hafıza[3]-Hafıza[4]
Görüleceği gibi toplam 5 adet dizi değişkeni kullanılabilir durumdadır ve en yüksek index sayısı ise 4 dür.
Şimdi sen bu şekilde değişken tanımlamışsın ama diziyi 6 elemanlı olarak kullanmaya çalışıyorsun sorun burada.
Çözüm tanımladaki 5 rakamını 6 yapmaktan geçiyor.
Aynı sorun diğer dizi değişkenleri içinde geçerlidir.
Ete

dnaci

Evet haklısınız dizi tanımlamalarımı kontrol ettim, 5 değeri yerine MESAJ ve HAFIZA değişkenlerinde 6 verdim. GSMNO 13 onu doğru vermişim. Ancak yine şifre yanlış uyarısı alıyorum. FOR NEXT döngümde bir hatamı yapıyorum hocam.

aRci

şifre karşılaştırması yaparken ekranda hangi değerleri görüyorsunuz.

dnaci

Ekranda HAFIZA için sırasıyla 1-2-3-4-5-6  MESAJ içinde 1-2-3-4-5-6 birebir yani. Nasıl çalışmaz hayret ediyorum.

aRci

sanırım hata veri formatı siz
HAFIZA[0]=1
HAFIZA[1]=2
HAFIZA[2]=3
HAFIZA[3]=4
HAFIZA[4]=5
HAFIZA[5]=6

olarak şifreyi giriyorsunuz ama mesajı "123456" olarak gönderiyorsunuz yani aslında

mesajı 49,50, 51, 52, 53, 54 olarak göndediğiniz için hata veriyor.


HAFIZA[0]="1"
HAFIZA[1]="2"
HAFIZA[2]="3"
HAFIZA[3]="4"
HAFIZA[4]="5"
HAFIZA[5]="6"

olarak değiştirip deneyiniz.

aRci

bence sifre gereksizde olabilir ben ce kayıtlı telefon numarası uzerinden gidilerek gelen mesajın kayıtlı yada etkili telefon olarak gelen komut yorumlanması yeterli olabilir. her seferinde mesaja sifre ardından komt yazmak ek kulfet olaacaktır. ayrıca sifrenın başkası tarafında ögrenilmemesi için mesajın gönderilen telefonda silinmesi de cabası mesala sadece yetki işleminde şifre sorgulanabilir.

ete

Tahminim ettğim bir şey var ama incelemekte yarar var.
$c0,#HAFIZA[0],#HAFIZA[1],#HAFIZA[2],#HAFIZA[3],#HAFIZA[4],#HAFIZA[5],MESAJ[0],MESAJ[1],MESAJ[2],MESAJ[3],MESAJ[4],MESAJ[5]
ifadesine bakılırsa Hafıza değerlerini rakam olarak ekrana yazdırıyorsun ama Mesaj değerlerini ASCII olarak ekrana yazdırıyorsun. Ekrana bakınca da 1,2,3,4,5,6  -- 1,2,3,4,5,6 görüyorsun. Ama gerçekte senin değerlerin şöyle bana kalırsa
1,2,3,4,5,6 - 49,50,51,52,53,54
Tahminim doğru ise görsel eşitlik var ama rakamsal eşitlik yok demektir. Anlamaının tek yolu aşağıdaki kodu ilave etmen.
FOR SAY=0 to 5
  Mesaj[SAY]=MESAJ[SAY]-48
NEXT
Bu satırları aslında HSERIN komutunun hemen altına eklemen gerekir. Zira yalnızca Seri portdan bilgi okunduktan hemen sonra bu işlemin yapılması gerekir.
Bu ilaveyi yaptıktan sonra ekran gösteriminde Mesaj(0)-Mesaj(5) aralığını da başına # koyarak göstermen gerekecektir.

Ete

dnaci

Ete hocam ve aRci sağolun sayenizde çözdüm sorunu. LCD'de görülen değerlere o kadar takılmışım ki ascii değerleri gözardı ettim. Gün boyu yazılımca uğraşınca kafası karışıyor insanın.

Ete hocam önerdiğiniz kodları birebir uyguladım şu an doğru şifre ile kontrol yanlış şifre ile işlem yapılmıyor. Kodların son halini ekliyorum.

aRci önerilerin için teşekkür ederim. Şifre her sms'te gereksiz doğru. Zaten bu bir ön çalışma, yetkili numaralar için bir admin şifresi gerekli ve bu şifre kullanıcı tarafından değiştirilebilmeli. Bu çalışma ile bu konuyu çözebilirim artık. Yetkili numaralar dışında hiç bir numara işlem yapamaz. Şimdi eproma yetkili gsm numaraları kayıt edip o numaraları sorgulayarak onlar dışında işlem yapılmamasını sağlayabilirim. Birde fabrika ayarlarına dönüş iyi olur. İlginiz için sağolun. İyi akşamlar.

HSERIN 5000,MLIST,[WAIT("REC UNREAD"),skip 3,str GSMNO\13, skip 29,STR MESAJ\13]
FOR SAY=0 to 5
  Mesaj[SAY]=MESAJ[SAY]-48
NEXT
Lcdout $fe, 1
PAUSE 100
HSEROUT [26]
Lcdout "KONTROL NO:"
Lcdout $FE, $c0,GSMNO[0],GSMNO[1],GSMNO[2],GSMNO[3],GSMNO[4],GSMNO[5],GSMNO[6],GSMNO[7],GSMNO[8],GSMNO[9],GSMNO[10],GSMNO[11],GSMNO[12]
pause 1000

Lcdout $fe, 1
PAUSE 50

HAFIZA[0]=1
HAFIZA[1]=2
HAFIZA[2]=3
HAFIZA[3]=4
HAFIZA[4]=5
HAFIZA[5]=6

pause 500
Lcdout $fe, 1
Lcdout " KOMUT MESAJI:"
Lcdout $FE, $c0,#HAFIZA[0],#HAFIZA[1],#HAFIZA[2],#HAFIZA[3],#HAFIZA[4],#HAFIZA[5],#MESAJ[0],#MESAJ[1],#MESAJ[2],#MESAJ[3],#MESAJ[4],#MESAJ[5]
pause 1500

SIFRE_KONTROL:
FOR  SAY=0 TO 5
    IF HAFIZA[SAY] <> MESAJ[SAY] THEN
       LCDOUT $FE,$80,"SIFRE YANLIS"
       pause 800
       GOTO MESAJ_DELETE
   ENDIF
       NEXT SAY
       HIGH ROLE1
       GOTO SEND_SMS1     
RETURN

aRci

ben genelde alttaki gibi bir format kullanıyorum bu formatta
karşılaştırılan deger lookup ile tek tek kontrol edilip dogru sonuc alırs işlemi gerçekleştiriyor. yanlış ise next dongusunden çıkıp devam ediyor.


for a = 0 to 4
lookup a,["RAPOR"],a1
if gelen [a]  = a1 and a = 4 then                     'eger tum degerler doru ise
HSEROUT [10,13,"CiKiSLAR: ",BIN8 portd
a=4
endif
if gelen [a]  <> a1 then A = 4
next

aRci

merhab arkadaslar konu dısı olarak bir sorum olacak.Normal sim ile data sim arasında ne fark var. mesala data sim aldığımda ve telefonuma takarsam internete girebilirmiyim bu simlerde ucretlendirme ne dir. bilgisi olan varmı

Powered by EzPortal