seri haberleşmeden gelen dataların ayrımı

Başlatan dcelektronik, 21 Kasım 2018, 14:25:16

dcelektronik

Merhabalar

arduino tarafında 3 adet analog değer okuyorum
1.ci değer 0-100 arasında 8Bytelık değer
2.ci değer 0-2000 arasında 16Bytelık değer
3.cü değer 0-6 arasında 32byte(float) değer
ve diğerleri ile birlikte string karekter olarak yolluyorum bu tarafta birsıkıntı yok değerler alıcı tarafa geliyor.Alıcı kısımda 16F628A ve Lcd display var.Gelen datayı getc() ile alıyorum.22441865391236548915 şeklinde ekrana yazıyor.Gelen dataları ikişer ikişer nasıl ayırırım.PBP da Hserin[data1,data2,data3......]koımutuyla alınıyordu.CCs c de buna benzer bir yol varmı?.Birde sayılar 1-1000 arası olduğunda data[5]...[8] yerleri sürekli değişiyor baştan 4 karekter sabit onları hallettim. kodu ekliyorum.Yardımcı olursanız sevinirim.

#include <RS232deneme1.h>
#include <string.h>
#include <stdlib.h>

#define LCD_ENABLE_PIN PIN_B3
#define LCD_RS_PIN PIN_A4
#define LCD_RW_PIN PIN_A5
#define LCD_DATA4 PIN_A0
#define LCD_DATA5 PIN_A1
#define LCD_DATA6 PIN_A2
#define LCD_DATA7 PIN_A3

#include <lcd.c>
#define BUFFER_SIZE 22 // 80

byte  buffer[BUFFER_SIZE];
//int data;
int data[];
int1 string_alindi=0;
int8 index;
int8 calis;
int8 dur;
int Tuz;
int8 Hp;
int str_adedi;

#int_rda
void seri_kesme(void)
{
//disable_interrupts(INT_RDA);
output_high(PIN_B0);

data=getc();
if(index<BUFFER_SIZE)
{
buffer[index]=data;
index++;
}
if(data==13)
{
index=0;
string_alindi=1;

//enable_interrupts(INT_RDA);
}}


void main()
{
  lcd_init();
  enable_interrupts(INT_RDA);
  enable_interrupts(GLOBAL);

  
  printf(lcd_putc,"\f DC Watermakers");
  printf(lcd_putc,"\n    V1.25");
  output_low(PIN_B7);

  while(TRUE)
  {
    if(string_alindi==1)
    {
    /*printf(lcd_putc,"\f");
    lcd_gotoxy(1,1);
    printf(lcd_putc,"%s\n",buffer);
    */
    printf(lcd_putc,"\f%s\n",buffer);
    string_alindi=0;
    delay_ms(300);/*
    buffer[5]=buffer[5]-0x30;
    buffer[6]=buffer[6]-0x30;
    buffer[7]=buffer[7]-0x30;
    buffer[8]=buffer[8]-0x30;*/
  buffer[5]=(buffer[5]<<4)+buffer[6];//calış bilgisi
  buffer[7]=(buffer[7]<<4)+buffer[8];//dur bilgisi
  buffer[8]=(buffer[8]<<4)+buffer[9];//Tuz hi
  buffer[10]=(buffer[10]<<4)+buffer[11];//Tuz low
  // buffer[7]=(buffer[7]<<4)+buffer[8];
  //buffer[8]=buffer[8]-0x30;
  // buffer[10]=buffer[10]-0x30;
  Tuz=(buffer[5]<<8)+buffer[7];//tuz hesaplama sonu
  /* Tuz=strcat(buffer[5],buffer[7]);
    buffer[9]=buffer[9]-0x30;
    buffer[10]=buffer[10]-0x30;
    buffer[9]=(buffer[9]<<4)+buffer[10];
    Hp=buffer[9];
    buffer[1]=buffer[1]-0x30;
    buffer[2]=buffer[2]-0x30;
    calis=(buffer[1]<<4)+buffer[2];
    buffer[3]=buffer[3]-0x30;
    buffer[4]=buffer[4]-0x30;
    dur=(buffer[3]<<4)+buffer[4];*/
  
  
    printf(lcd_putc,"\fTuzH:%c TuzL:%c",buffer[1],buffer[2]);
    printf(lcd_putc,"\nGl:%x",Tuz);
    
    //buffer[0]=0;buffer[1]=0;buffer[2]=0;buffer[3]=0;buffer[4]=0;buffer[5]=0;buffer[6]=0;buffer[7]=0;
    delay_ms(300);
    output_low(PIN_B0);
    }

  }
}

ziyaretci

## "1.", "2."... Madde numarasından sonra konulan nokta "-inci, -ıncı, -uncu, ..." manası taşır. Ek olarak "-ci" yazmayın.

## Cümleye büyük harfle başlanır.

## Nokta('.', '!', '?', ...) ve virgülden sonra bir boşluk bırakılır.

## Soru cümlelerinin sonuna '?' karakteri konulur.

## "mı?, mi?, mu?, ..." soru ekleri ayrı yazılır.




Şimdi bana sanki byte ile biti karıştırıyorsunuz gibi geldi. Öncelikle bunu düzeltelim.

1 byte = 8 bit
2 byte = 16 bit
4 byte = 32 bit

Bence şuan yapmak istediğinizle alakalı ne ile uğraşıyorsanız bırakın ve mantık devreleri, sayısal tasarım gibi konuları anlatan bir kitap alarak temiz bir şekilde bilgilerinizi tazeleyin.

Şimdi arama motoruna yazdım, en başta çıkan sonucu paylaşıyorum.

Yazar: Hüseyin EKİZ
Yayınevi: Değişim yayınları
Kitap adı: Mantık Devreleri



Hocalarım affetsin ama şu düşüncemi paylaşmak istiyorum. İlk defa mikrodenetleyici programlayacak olan arkadaşlar gelip fikrimi almak istediklerinde onlara şu düşüncelerimi aktarıyorum; ben bu işe PIC ile başladım, eğer sende PIC ile başlarsan sana bildiklerimi detaylıca simüle ederek aktarabilirim. Sorularına belli bir seviyeye kadar kesin ve net cevaplar veririm. Ama arduino gibi bir kit ile başlayacaksan pek yardımcı olamam temel mantık dışında diyorum. Ama sen yeterki başla. Nette hazır kodlar var, kopyala-yapıştır, ledini yak. Fakat programlamanın temel mantığını kavradığında(1-3 ay) devresini kendin kurabileceğin bir platforma geç.

Mesela ASM ile bir led yak. 1 saniyelik gecikme oluştur. X portunun 8. bitini giriş yap. Sonra aynı işlemleri C'de yap. Neyin nasıl işlediğini gör.

Değerli hocam @skara1214 'e selamlar.

fide

#2
Basit olarak [veri1] [veri2] [veri3] şeklinde paketle gönder. Sonra da parantez sayarak verileri al. Bu şekilde karışıklık olmaz.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

dcelektronik

Fide çok teşekkürler.Bu şekilde deneyeceğim.