Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

strncmp fonksiyonu

Başlatan xoom, 22 Kasım 2016, 19:19:10

xoom

Hatamı bulmamda yardımcı olurmusunuz.

char gelen[8];
char aranan[] = "YES";

gets(gelen);
puts(gelen);

if (strncmp(gelen,aranan,3) == 0) output_high(pin_X);


şeklinde bir fonksiyon kullanıyorum..fakat gelen mesajın içinde aradığım kelime olmasına rağmen X pinindeki Çıkışı aktif yapamıyorum.
Mantık hatasımı yapıyorum yoksa kodlama hatası mı?

gelen mesajım
+CMT: "+xxxxxxxxxxxx","","16/11/22,19:06:58+12"
YES


Yukaridaki "YES" kelimesini  yazdığım fonksiyon ile yakalamıyorum.



vitruvius

Tam kavrayamadım. If içindeki "gelen" verisi neyden oluşuyor? Önce bundan bir emin olalım.

xoom

Alıntı yapılan: vitruvius - 22 Kasım 2016, 19:44:38
Tam kavrayamadım. If içindeki "gelen" verisi neyden oluşuyor? Önce bundan bir emin olalım.
yukarida yazdığım gibi  gelen mesajımı gelen[8]; adlı diziye alıyorum. yada aldığımı sanıyorum:)

Gelen veri:
+CMT: "+xxxxxxxxxxxx","","16/11/22,19:06:58+12"
YES

vitruvius

O kadar uzun mesaj [8] diziye nasıl sığıyor?

strncmp'in tanımlanması şu şekilde:

int strncmp ( const char * str1, const char * str2, size_t num );


Buradaki num: kaç karakterin kıyaslanacağını bildiriyor.

Siz buna "3" demişsiniz. Yani strncmp fonksiyonuna verdiğiniz dizilerdeki ilk üç karakter kıyaslanacak. Bu durumda "xYES" ile "YES" kıyası 0'dan farklı bir değer döndürür.

Sizin "gelen" verinizde "YES" en sonda. Bu sebeple kıyaslamanız '0' döndürmüyor.

xoom

Alıntı yapılan: vitruvius - 22 Kasım 2016, 20:13:35
O kadar uzun mesaj [8] diziye nasıl sığıyor?

strncmp'in tanımlanması şu şekilde:

int strncmp ( const char * str1, const char * str2, size_t num );


Buradaki num: kaç karakterin kıyaslanacağını bildiriyor.

Siz buna "3" demişsiniz. Yani strncmp fonksiyonuna verdiğiniz dizilerdeki ilk üç karakter kıyaslanacak. Bu durumda "xYES" ile "YES" kıyası 0'dan farklı bir değer döndürür.

Sizin "gelen" verinizde "YES" en sonda. Bu sebeple kıyaslamanız '0' döndürmüyor.
ben mesajın sonundaki son 8 Byte'ın dizide kaldığını düşünüyordum. Peki sizin öneriniz nedir?

mufitsozen

#include <string.h>

if(strstr(gelen,aranan) != NULL) {
    /* ... */
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

xoom

Alıntı yapılan: mufitsozen - 22 Kasım 2016, 21:03:59
#include <string.h>

if(strstr(gelen,aranan) != NULL) {
    /* ... */
}
Merhabalar, Bu şekilde olur mu? Gereksiz iş mi yapmış olurum?
char  gelen[];
char aranan[]="YES";
char bulunan[];

bulunan=strstr(gelen,aranan);
if(strncmp(bulunan,aranan,3))output_high(pin_X);



mufitsozen

#7
bulunan kismi gereksiz ve isi karistirır.

Zaten strstr size NULL olmayan bir pointer donduruyorsa orada aradiginiz dizi ile baslayan kisim vardir.

bulunan dizisi ile ne yapmak istediginizi tam olarak anlayamadim. Belki niyetinizi biraz daha detayli aciklasaniz o konuda fikrimi soyleyebilirdim.

char  gelen[];
char aranan[]="YES";

if(strstr(gelen,aranan)!=NULL)output_high(pin_X);


is gormuyormu?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

xoom

#8
Alıntı yapılan: mufitsozen - 22 Kasım 2016, 21:24:34
bulunan kismi gereksiz ve isi karistirır.

Zaten strstr size NULL olmayan bir pointer donduruyorsa orada aradiginiz dizi ile baslayan kisim vardir.

bulunan dizisi ile ne yapmak istediginizi tam olarak anlayamadim. Belki niyetinizi biraz daha detayli aciklasaniz o konuda fikrimi soyleyebilirdim.

char  gelen[];
char aranan[]="YES";

if(strstr(gelen,aranan)!=NULL)output_high(pin_X);


is gormuyormu?
Görmedi. Büyük ihtimalle ben beceremedim. Şimdi Gelen bilgi 2 satırda geliyor.
önce burası
+CMT: "+xxxxxxxxxxxx","","16/11/22,19:06:58+12"

sonra aşağısı
YES

ben şimdi bunu gets(gelen) ile aldığımda char gelen[] adlı diziye hangisi giriyor anlamış değilim.

Alıntı Yapbulunan dizisi ile ne yapmak istediginizi tam olarak anlayamadim. Belki niyetinizi biraz daha detayli aciklasaniz o konuda fikrimi soyleyebilirdim.
aslında bulunan dizisiyle hiçbir işim yok.. sadece yukarıdaki seriporttan gelen bilginin içindeki YES kelimesini yakalamak istiyorum.
ama gelen bilgi yukarıda yazdığım gibi 2 satırda geliyor. esas aradığım bilgi 2.satırda oluyor genelde.

mufitsozen


gets ile bir seferde bir satir alirsiniz
o yuzden sizin orneginizde belki

gets(..
gets(..
if(strstr(.....

yazmak denenebilir.

Ama daha dogrusu eger komut gonderdikten sonra gelen satir sayisini bilmiyorsaniz loop icinde bakip beklenen string alinmadigi durum icin  birde timer isletmek gerekir (timeout durumunu kontrol icin).
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

calisirmi bilemem ama timeout yaparak suna benzer bir program calisir herhalde. fikir versin diye yaziyorum bende MCU filan olmadigi icin hatalar icerebilir.

#include <stdio.h>
#include <string.h>
#include <stdint.h>

volatile uint16_t timertick; /* 16 bit 10ms tick timer */

char yes[]="YES";



char *dizibekle(char *aranan){
#define TO_BEKLE 200  /* 2sn bekleme timeout degeri */ 
    uint16_t tmr_basla;
    char gelen[82];
    char *araptr;
    tmr_basla = timertick;
    
    while( (timertick-tmr_basla)>TO_BEKLE ){ /* Istenen dizi gelene kadar ara */
        gets(gelen);
        if (NULL != (araptr=strstr(gelen,aranan)) )return araptr; /* aranan dizi geldi*/
    } 
    return NULL; /* timeout oldu aranan dizi gelmedi */
}



int main()
{
    printf("Hello, World!\n");

    if( NULL==dizibekle(yes) ){
        printf("\n beklenen %s geldi!\n", yes);
    } else {
        printf("\n *** timeout %s gelmedi ***\n",yes);
    }

    return 0;
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

xoom

#11
Alıntı yapılan: mufitsozen - 22 Kasım 2016, 21:47:54
gets ile bir seferde bir satir alirsiniz
o yuzden sizin orneginizde belki

gets(..
gets(..
if(strstr(.....

yazmak denenebilir.

Ama daha dogrusu eger komut gonderdikten sonra gelen satir sayisini bilmiyorsaniz loop icinde bakip beklenen string alinmadigi durum icin  birde timer isletmek gerekir (timeout durumunu kontrol icin).
olmuyor olmuyor olmuyor.. 2 saatir denemediğim yöntem kalmadı.
Seriporttan gelen cevabı gets(gelen),Scanf(gelen) diye almaya çalıyorum alamıyorum.
if (strstr(gelen,aranan) !=NULL)output_high(pin_d4);

bir türlü çıkışı high yapamıyorum.. Direk YES yazıyorum terminalden ona rağmen olmuyor..
Edit: Son mesajınızı inceleyeceğim teşekkürler.

Edit2: Yukarıdaki Kodlar ufkumu açtı.. ve amacıma ulaştım teşekkürler..

mufitsozen

Alıntı yapılan: xoom - 22 Kasım 2016, 23:33:47
Edit: Son mesajınızı inceleyeceğim teşekkürler.
Edit2: Yukarıdaki Kodlar ufkumu açtı.. ve amacıma ulaştım teşekkürler..

Sizede tesekkurler, Gerilimli gecen bir gunu tam bitirirken ise yarar bir adam gibi hissettim kendimi, Mutlu oldum :)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.