C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

yldzelektronik

#600
Alıntı yapılan: berat23 - 11 Eylül 2013, 10:34:20
karakter karakter alıp bitirme karakterini arıyorum, mesela \n\r gibi.

Kod örneği vermeniz mümkün mü?

@meftun senin yaptığının benzerini yaptım ancak nedense bir türlü o 13 karakterini yakalayamıyorum :(
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

coderun

Şöyle birşey yapsak uzunluğu belli olmayan veriyi rs232 ile yollarken:
1) ilk olarak ( ilk byte) gönderilecek datanın uzunluğunu yollayalım ve ardından datayı yollayalım
2) CCS C de verileri alırken getch(); fonk. gönderirken de putc(); fonk. kullanalım.



örnek kod (proteus da denedim)

#include <16f877a.h> 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, stop=1)

int data[16];
int aktar[16]={1,1,2,3,4,5,6,7,13,51};
//aktar ın ilk byte uzunluk verisi gönderilecek veri
int sayac; 

#int_rda
void rs232_alim()
{
 disable_interrupts(int_rda);
 int uzunluk; // alınacak datanın uzunluğunu icerir
 uzunluk=getch();// gelen verinin uzunluk bilgisini aktardık
 
 for(sayac=1;sayac<=uzunluk;++sayac) // veriler alınıyor. 
  data[sayac]=getch(); 
 //gelen verilerden ilki uzunluk olduğundan sayac=1 den başlatıldı
 
 //----------bu if ile gelen verilerden birini sorgulayarak dogru alım oldu mu diye baktım
 // tamamen deneme amaclı 
  if(data[8]==13)
    output_toggle(pin_b2);
  else
    output_toggle(pin_b3);
  
}
////////////////////////////////RS232_veri_basma////////////////////////////////
void veri_bas(int uzunluk)
{
  aktar[0]=uzunluk;
  for(sayac=0;sayac<=uzunluk;++sayac)//uzunluk byte ile uzunluk+1 kadar byte gönderilir toplamda 
  putc(aktar[sayac]);
  output_toggle(pin_b4);// sadece veri göndermenin gerçekleştigini görmek icin 
}

//*************************ANA FONKSİYON***************************************
main()  
{ 
 enable_interrupts(global);
 enable_interrupts(int_rda);
 output_low(pin_b2);
 while(1)
{
 enable_interrupts(int_rda);
 if(input(pin_b0))
 {
  while(input(pin_b0));
  veri_bas(8); // 8 gönderilecek data uzunluğu 8 byte 
  
 }
}
}


yldzelektronik

#602
Alıntı yapılan: coderun - 11 Eylül 2013, 12:21:25
Şöyle birşey yapsak uzunluğu belli olmayan veriyi rs232 ile yollarken:
1) ilk olarak ( ilk byte) gönderilecek datanın uzunluğunu yollayalım ve ardından datayı yollayalım
2) CCS C de verileri alırken getch(); fonk. gönderirken de putc(); fonk. kullanalım.



örnek kod (proteus da denedim)

#include <16f877a.h> 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, stop=1)

int data[16];
int aktar[16]={1,1,2,3,4,5,6,7,13,51};
//aktar ın ilk byte uzunluk verisi gönderilecek veri
int sayac; 

#int_rda
void rs232_alim()
{
 disable_interrupts(int_rda);
 int uzunluk; // alınacak datanın uzunluğunu icerir
 uzunluk=getch();// gelen verinin uzunluk bilgisini aktardık
 
 for(sayac=1;sayac<=uzunluk;++sayac) // veriler alınıyor. 
  data[sayac]=getch(); 
 //gelen verilerden ilki uzunluk olduğundan sayac=1 den başlatıldı
 
 //----------bu if ile gelen verilerden birini sorgulayarak dogru alım oldu mu diye baktım
 // tamamen deneme amaclı 
  if(data[8]==13)
    output_toggle(pin_b2);
  else
    output_toggle(pin_b3);
  
}
////////////////////////////////RS232_veri_basma////////////////////////////////
void veri_bas(int uzunluk)
{
  aktar[0]=uzunluk;
  for(sayac=0;sayac<=uzunluk;++sayac)//uzunluk byte ile uzunluk+1 kadar byte gönderilir toplamda 
  putc(aktar[sayac]);
  output_toggle(pin_b4);// sadece veri göndermenin gerçekleştigini görmek icin 
}

//*************************ANA FONKSİYON***************************************
main()  
{ 
 enable_interrupts(global);
 enable_interrupts(int_rda);
 output_low(pin_b2);
 while(1)
{
 enable_interrupts(int_rda);
 if(input(pin_b0))
 {
  while(input(pin_b0));
  veri_bas(8); // 8 gönderilecek data uzunluğu 8 byte 
  
 }
}
}



Çok iyi örneklenmiş teşekkürler.Ancak yaşadığım soruna çözüm değil ne yazık ki.Çünkü sorun pc tarafında terminal ile mcu üzerindeki menüye ulaşmak.Menüye giriş için karakterler genelde tek byte ancak bazen 3 4 belki 6 byte olabiliyor.Değer atamaları için.Kullanıcının terminalde kaç karakter göndereceğini eklemesi çok uygun olmaz sanırım?

İşin diğer boyutu her menünün bir de alt menüsü var ki en az bir alt menü.Hal böyle olunca biraz karışıyor.Mcudan mcuya rs232 üzerinden gönderim yapmak istediğimde sorun yok ancak pcden mcuya farklı uzunluklarda string göndermek istediğimde mecburen \r karakterini bekliyorum.Ancak terminal programlarıyla \r karakterini gönderemiyorum.  ???

Monitör programıyla seri protu gözlüyorum ve gönderdiğim veriler arasında \r yada \n karakteri yok.

Şöyle ki;




Benim terminalde menüye eriştiğimde elde etmem gereken görüntü;





gets() kullandığımda \r gelmeyince çakılıp kalıyor.getch kullansam tek karakter alabiliyorum.getc ile döngüye girsem iki ihtimal var.

Ya belli uzunlukta string alıcam yada enter bekleyecem ki getsden farkı yok.İlk ihtimali düşünsek sorun da bu zaten.String uzunluğu belli değil.En büyük string uzunluğu kadar döngü kursam kullanıcı her seferinde o kadar karakter göndermek zorunda kalıyor.

Mesela en fazla 6 karakter olsun.Döngüyü 6 karakter için kurduğumda 1 karakterle menüye erişilebilecek yerlerde dahi 6 karakter göndermesi gerekiyor ki bu rahatsız edici ve hiç kullanışlı değil.

Acaba ben mi büyütüyorum olayı?Biri fikir verebilir mi?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Acaba C ile
12345
23451
34512
45124
51234

nasıl yazabiliriz.

yldzelektronik

Alıntı yapılan: Fkarizmatik - 11 Eylül 2013, 13:11:28
Acaba C ile
12345
23451
34512
45124
51234

nasıl yazabiliriz.

Bu benim soruma cevaben mi yazıldı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

kantirici

#605
@yldzelektronik kendine bir protokol yapmalısın. Mesela her verinin sonunda \r olursa verisonu geldigini anlamış olursun. Veriyide kesme ile almalısın. Her kesmede gelen veriyi kontrol ederk \r gelmişse bir bayragı setleyerek main içerisinde ilgili işlemi yapıp bayragı sıfırlamalısın, temel yapı bu şekilde.

@Fkarizmatik Bu rakamlar bir dizide olsun. Diziyi ekrana bastıktan sonra dizi uzunlugu kadar bir döngüde
{
temp=dizi;
dizi=dizi[i+1];
dizi[i+1]=temp;
}

böylece dizinin yanyana iki elemanını yer değiştirdik.temel yapı bu şekilde, daha optimum birşeylerde yazılabilir.

yldzelektronik

Alıntı yapılan: kantirici - 11 Eylül 2013, 13:49:38
@yldzelektronik kendine bir protokol yapmalısın. Mesela her verinin sonunda \r olursa verisonu geldigini anlamış olursun. Veriyide kesme ile almalısın. Her kesmede gelen veriyi kontrol ederk \r gelmişse bir bayragı setleyerek main içerisinde ilgili işlemi yapıp bayragı sıfırlamalısın, temel yapı bu şekilde.


Gelen veriyi kesme ile alıyorum
\r sorgusu yaptığım için programım çakılıyor.
Sorun gelen veriyi yakalamak da değil.Gelen veri içerisinde \r olmamasından kaynaklanıyor.
Mcu to mcu olduğunda sorun yok.
Sadece terminal gibi programlar kullandığımda bu sorunu yaşıyorum.
https://www.picproje.org/index.php/topic,35908.msg364197.html#msg364197
resimlerle gösterdiğim gibi porta pcnin yazdığı verilerde \r yok.
Zaten bütün mesele de bu. ???
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

berat23

@yldzelektronik

şimdi kod veremem fakat beklerseniz akşam eve gidince birşeyler paylaşabilirim.  ben gps mesajlarını parse ederken kullanmıştım, aşşağı yukarı benzer bir mantık. uyduya bağlandığında mesaj daha uzun oluyordu, bağlanamadığı zaman daha kısa oluyordu.

yldzelektronik

Alıntı yapılan: berat23 - 11 Eylül 2013, 14:43:38
@yldzelektronik

şimdi kod veremem fakat beklerseniz akşam eve gidince birşeyler paylaşabilirim.  ben gps mesajlarını parse ederken kullanmıştım, aşşağı yukarı benzer bir mantık. uyduya bağlandığında mesaj daha uzun oluyordu, bağlanamadığı zaman daha kısa oluyordu.

Halen beklemedeyim.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mr.Java

Alıntı yapılan: kantirici - 11 Eylül 2013, 13:49:38
@yldzelektronik kendine bir protokol yapmalısın. Mesela her verinin sonunda \r olursa verisonu geldigini anlamış olursun. Veriyide kesme ile almalısın. Her kesmede gelen veriyi kontrol ederk \r gelmişse bir bayragı setleyerek main içerisinde ilgili işlemi yapıp bayragı sıfırlamalısın, temel yapı bu şekilde.

@Fkarizmatik Bu rakamlar bir dizide olsun. Diziyi ekrana bastıktan sonra dizi uzunlugu kadar bir döngüde
{
temp=dizi[i+1];
dizi=dizi[i+1];
dizi[i+1]=temp;
}

böylece dizinin yanyana iki elemanını yer değiştirdik.temel yapı bu şekilde, daha optimum birşeylerde yazılabilir.

Çift boyutlu bir dizide gösterebilirmisiniz hocam

kantirici

Çift boyutlu derken biraz daha açarmısınız? Dizinin satır ve sutünları arasındamı değiştirmek istiyorsunuz?

Mr.Java

Yukaridaki belirttigim 5x5 matrisin algoritmasini cozemedim Ornekbir program  ile yardimci olabilirmisiniz Cift bouytlu dizilerde swap islemini anlamadim.

Tesekkurler iyi forumlar

yldzelektronik

Selamlar.

Eepromda bir tablo oluşturmak istiyorum.Cihazın açılışta default değerleri tutabilmesi için.

Ancak sol tarafı 4 sağ tarafı 2 haneli bir sayıyı en verimli ve hızlı okuyup yazabilmek şartıyla eeproma nasıl yazdırabilirim?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

fatih6761

Alıntı yapılan: yldzelektronik - 13 Eylül 2013, 17:20:25
Selamlar.

Eepromda bir tablo oluşturmak istiyorum.Cihazın açılışta default değerleri tutabilmesi için.

Ancak sol tarafı 4 sağ tarafı 2 haneli bir sayıyı en verimli ve hızlı okuyup yazabilmek şartıyla eeproma nasıl yazdırabilirim?
Hocam haneleri belirtmişsiniz ancak biraz daha detaya inebilir misiniz? 2048'e kadar sayıları 11 bit ile saklayabilirsiniz ancak 9999 için en az 14-bit gerekiyor. İki haneli sayı 99'a kadar olacaksa 7-bit yeterli.
Boyutu küçültmek için bu şekilde bit hesabı yapmalısınız. Hız konusu işlemciye bağlı. Mimari 8-bit ise 16-bit sol ve 8-bit sağ olarak 3 baytlı bir yapı olur. Ancak 16-bit işlemcide verilerin 16-bit olması işlem hızını arttıracaktır.
İyi çalışmalar...

yldzelektronik

Alıntı yapılan: fatih6761 - 13 Eylül 2013, 18:09:52
Hocam haneleri belirtmişsiniz ancak biraz daha detaya inebilir misiniz? 2048'e kadar sayıları 11 bit ile saklayabilirsiniz ancak 9999 için en az 14-bit gerekiyor. İki haneli sayı 99'a kadar olacaksa 7-bit yeterli.
Boyutu küçültmek için bu şekilde bit hesabı yapmalısınız. Hız konusu işlemciye bağlı. Mimari 8-bit ise 16-bit sol ve 8-bit sağ olarak 3 baytlı bir yapı olur. Ancak 16-bit işlemcide verilerin 16-bit olması işlem hızını arttıracaktır.
İyi çalışmalar...

sayı maksimum 1100.00 olabiliyor.En az 800.00.Küsüratta da evet .99 en fazla.

Ben sprintf ile stringe çevirip 7 byte ile hallederim diye düşündüm ancak sizin dediğiniz yöntemi biraz açar mısınız?Anlamadım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.