MikroC PIC-UART veri yorumlama sorunu

Başlatan metaltrrocker, 10 Mart 2014, 15:19:32

metaltrrocker

Merhabalar. UART ' tan gelen "=bxxxxx" (x ler rakam olacak şekilde) verisini yorumlamam gerekecek. "=b" verisi verinin türü, "xxxxx" kısmı ise işlenecek değer. Burda esas yapmak istediğim, Gelen veriyi =b ile başlıyorsa sonraki sayısal kısmı, seçtiğim 7 segmentlere yazdırmak.Şimdiye kadar düzenleyip çalıştırmaya uğraştığım kodlar aşağıda. Uarttan gelen veri 115200 baudrate ile geliyor.(bu kısım sabit) Proteusta bu değeri elle girince sorun yok.Veri alıp aynısını gönderme de sıkıntı yok. Dediğim gibi veriyi yorumlayamıyorum.
proje dosyaları linki --> https://www.mediafire.com/?i9msi5scthokyk9
char uart_rd;
char veri[29];
int x=0;

void main() 
{
  ADCON1 = 0x0F;                 // Çıkışları dijital yapıyoruz.
  TRISD = 0x00;
  TRISB = 0x00;
  PORTB = 0x00;
  PORTD = 0x00;
  UART1_Init(115200);             // UART modülü için ayarlamaları yapıyoruz.
  Delay_ms(100);                  // UART modülünün stabilize olmasını bekliyoruz.


  while (1) 
  { //Sonsuz döngü
      if(UART1_Data_Ready())
      {  uart_rd=UART1_Read();
         UART1_Read_Text(veri[0],"=",255);
         UART1_Write(10);
         UART1_Write(13);
         UART1_Write(veri[0]);
         if(veri[0]== '=')
         {
         PORTD=0x81;
         }
      }
   }
}

skara1214

verilerin sonuna /r eklete biliyormusun?
eğer evetse direk gets ile oku bir değişkene at mesela klavye ; stdlib.h ı eklemeyi unutma
gets(klavye);
if(klavye[0]=='=' && klavye[1]=='b')
{
for(i=2;i<20;i++)
klavye[i-2]=klavye;
xx=atoi32(klavye);
}
ben böyle kullanıyorum mis gibi çalışıyor
Herkes ölür ama herkes gerçekten yaşamaz

metaltrrocker

Cr+Lf ekleyebiliyorum. Aynı şekilde iş görür mü?

skara1214

görür ben aslında kodu ccs c için yazmıştım ama mikro c de hatırladığım su karakter gelene kadar datayı al vardı ondan sonra dediğim işlemleri yaparsan sadece sayı kısmını elde etmiş olursun
Herkes ölür ama herkes gerçekten yaşamaz

metaltrrocker

UART1_Read_Text(output, "OK", 10); şeklinde bir fonksiyon var ama "10" sayısının ne işe yaradığını anlamadım. Anladığımı sandığım kısım ise "OK" okununcaya kadarki veriyi outputa atıyor. Bu fonksiyonu denedim ama çalışmadı. Sizin verdiğiniz örnekte bazı sorunlar yaşadım. MikroC'ye göre düzenledim ama atoi() içerisine dizi elemanı koymama izin vermedi. Onun dışında UART1_Read() ile okuduğum veriyi dizi içerisine direk olarak sıralayıp yazdıramıyorum. gets(klavye)' nin kullanımı bu şekilde diye düşündüm.

metaltrrocker

------------------------------
aşağıdaki şekilde ilk 3 bilgiyi okuyorum.
Gelen bilgi "=b00500" olsun. Ancak veri[4] e denk gelen 5 sayısını okuyup aynen yazdıramıyorum.
{ // Endless loop
      if(UART1_Data_Ready())
      {
          for(i=0;i<=6;i++)
          {
          veri[i]=UART1_Read();
          Delay_ms(100);
          }
          UART1_Write(veri[0]);
          Delay_ms(50);
          UART1_Write(veri[1]);
          Delay_ms(50);
          UART1_Write(veri[4]);
          Delay_ms(50);
          PORTD = veri[4];
      }
   }

LukeSkywalker

Blogumdaki atx arx yazisini okuyabilirsiniz. Belki bir cagrisim yapabilir. Uart read text komutunu pek onermem.

metaltrrocker

Blogunuza göz atmıştım ama modülle alaka kuramayınca örneği de gözümden kaçırmışım. İlaç gibi geldi hocam teşekkür ederim :)

metaltrrocker

Şu an veriyi okuyorum. 7 segmente yazdırmaya çalışıyorum. İlk veri geldiği zaman, gayet güzel bir şekilde veriyi 7 segmente yazdırıyor. ancak 2'nci veri geldiği anda saçmalıyor.
Gelen veri şu anda aşağıdaki şekilde.(x' ler yine sayı olacak şekilde)
=bxxx

Proteus dosyalarını birazdan ekleyeceğim. 7 segment kısmı ya da veri aldaktan sonra bir karmaşıklık yaptım. Ama sorunu çözemedim.
Kodlar
char uart_rd,verix,xxt;
char veri[20],veribuffer[20];
const char yediseg[]={63,6,91,79,102,109,125,7,127};
int i=0;


void heading()
  {
  if(veribuffer[1]=='d')
              {
                /* 7 segment yazdırma kısmı */
                    /////////ilk hane
                    switch (veribuffer[2]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }
                    PORTD=0xFE;
                    Delay_ms(100);
                    //////////  ikinci hane
                    switch (veribuffer[3]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }
                    PORTD=0xFD;
                    Delay_ms(100);
                    ////////////  üçüncü hane
                    switch (veribuffer[4]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }
                    PORTD=0xFB;
                    Delay_ms(100);
              }
             }

void main() 
{
  ADCON1 = 0x0F;                 // Çıkışları dijital yapıyoruz.
  TRISD = 0x00;
  TRISB = 0x00;
  PORTB = 0x00;
  UART1_Init(115200);             // UART modülü için ayarlamaları yapıyoruz.
  Delay_ms(200);                  // UART modülünün stabilize olmasını bekliyoruz.
  PORTD=0xFF;
  veribuffer[0]=0x00;

  while (1)    // Sonsuz döngü
  {
      if(UART1_Data_Ready())
      {
           veribuffer[i]=UART1_Read();
           if(veribuffer[0]=='=')
           {
              i++;
           }
           if(i==5)
           {
              i=0;
           }
       }
       if(i==0)
          {
              heading();
              i=0;
              veribuffer[0] = 0x00;
          }
   }
}

LukeSkywalker

proje dosyanızı isis semaniz ile birlikte gönderirseniz bakayım.

metaltrrocker


z

Soruna cevap değil. Asagidaki satirlara gicik oldum.

switch (veribuffer[2]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;


Boyle yapmak yerine hepsini kaldir at. Asagidaki tek satiri kullan.

PORTB = yediseg[veribuffer[2]-0x30];


     

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

metaltrrocker

Haklısınız hocam kodlar optimize bir şekilde değil şu anki haliyle. Hiç gerçek devre tasarlamadım 7 segmentlerle. Proteustan paldır küldür gittik. Haliyle bizim hocalar da benim yazdığım şekilde ya da if'lerle gösterdiği için elimiz oraya gidiyor.

LukeSkywalker

bende çalışıyor kodlar
=d123, =d345,=d678 şeklinde gönderdiğim veriler displaylerde görünüyor.

metaltrrocker

#14
Şimdi olay ilginçleşmeye başladı benim açımdan :(
Şimdi olayı anlatayım tekrar kısaca. Belki eksik ya da yanlış anlatmışımdır bilmeden.
Ben "link2fs" adlı bir programdan "flight simulator x" yani uçuş simulatorü bilgilerini alıp 7 segmentlere yazdırmaya çalışıyorum.
Program belirli aralıklarla (veya ilgili gösterge değişince veriyi tekrar yolluyor)
Veriyi 7 segmentlerde sürekli göstermem gerekiyor.
Veriyi "VSPE" adlı programla sanal port oluşturarak proteustan okuyorum.
Bilgisizliğimden bir yerde yanlışlım mı var yoksa oluşan hata benim dışımda mı?
Mikroc yi çok iyi bilmiyorum.Yeni yeni birşeyler kapıyorum.
not:düzeltme.