Haberler:

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

Ana Menü

uart rx buffer temizleme

Başlatan frederic, 01 Şubat 2014, 19:58:58

frederic

Merhaba, seri iletişimde gelen verileri rda kesmesi ile başarılı şekilde alıyorum, ve bu verileri kaydetme ihtiyacım yok şu an. Sadece gelen verileri olduğu gibi lcd görsem yeter.

Sorun şu ki buffer dolduğunda gelen yeni veriler eski verilerin üzerine yazdırılıyor ve lcd de saçma karakterler görünüyor.
Ben lcd'de veriyi gördükten sonra buffer'ı silmek istiyorum bu yüzden. Bunu nasıl yapabilirim acaba?

MrDarK

Hocam kodlarınızı görelim ki buffer dediğiniz şeyin ne olduğunu anlayalım sizin ramde tuttuğunuz bir dizi mi yoksa uart'ın donanımsal buffer'ından mı bahsediyoruz bunları bilmek lazım ;

Ayrıca interrupt fonksiyonu içinde lcdveri fonksiyonunu kullanmak pekte akıllıca sayılmaz.
Picproje Eğitim Gönüllüleri ~ MrDarK

frederic

Kodlar aşağıda, bahsettiğim buffer uartın donanımsal bufferı'ı. Lcd'de kesme rutini içinde değil, ana döngüde gösteriyorum.


#include <2x16_4x20_LCD.c>

#include <string.h>

char dmo[20];
int a=0;

#int_rda
void serial()
{

disable_interrupts(int_rda);
gets(dmo);
output_toggle(pin_c0);
}


void main() 
{
   port_B_pullups(0x0F);
    
   setup_oscillator(OSC_8MHZ);
   enable_interrupts(int_rda);
   enable_interrupts(global);
   setup_adc_ports(no_analogs);
   setup_adc(adc_off);
   
   lcd_init();
   printf(lcd_putc,"\f");
   
   
   while(TRUE)
   {
   
   enable_interrupts(int_rda);
  
   lcd_gotoxy(1,1);
   printf(lcd_putc,"DENEME");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%s                    ",dmo);
   
   haberlesme_test_data();
   
    
   }

}

MrDarK

Hocam gelen verileri gets komutu ile değilde getc ile almanı tavsiye ederim. Şu şekilde revizyon yapıp kullanabilirsin.

char dmo[20];
int a,c,status=0;
unsigned char z=5; // Kaç karakter geldikten sonra lcd'de okunsun ? Burada örnek olarak 5 verdim

#int_rda
void serial()
{

disable_interrupts(int_rda);
dmo[c]=getc();
c++;
if(c==z)
{
status=1;;
}
output_toggle(pin_c0);
}

void main() 
{
   port_B_pullups(0x0F);
    
   setup_oscillator(OSC_8MHZ);
   enable_interrupts(int_rda);
   enable_interrupts(global);
   setup_adc_ports(no_analogs);
   setup_adc(adc_off);
   
   lcd_init();
   printf(lcd_putc,"\f");
   
   
   while(TRUE)
   {
   
   enable_interrupts(int_rda);
  
   lcd_gotoxy(1,1);
   printf(lcd_putc,"DENEME");
   lcd_gotoxy(1,2);
   if(status==1)
{
   printf(lcd_putc,"%s                    ",dmo);
   for(a=0;a<20;a++)
   dmo[a]=' ';  //Tüm datayı temizlemek için boşluk karakteri yüklüyoruz 20 karaktere de...
   c=0;            // Yeni gelecek datalar 0.datadan başlayacak
   status=0;   // Lcd'de istenilen adet karakter gelmeden gösterme yapılmayacak.
} 
   haberlesme_test_data();
   
    
   }

}
Picproje Eğitim Gönüllüleri ~ MrDarK

skara1214

veriyi alınca uartı ve kesmeyi kapat  bufferi oku işin bitince gene aç
Herkes ölür ama herkes gerçekten yaşamaz

frederic

Yanıtlar için teşekkürler her iki yöntemide deneyeceğim, bir sorunum daha var yalnız.

rf modülü pic ile cross bağlayıp haberleştirmeye çalışıyorum. Lcd bozuk olduğu için gelen veriyi görüntülemeye ihtiyacım var.

Çözüm olarak ise modülden aldığım cevabı, (usb seri dönüştürücü ile görüntüleyebilmek için) tekrardan module gönderiyorumki rx hattından  pc deki serial monitörden görebileyim cevabı. İlk gönderdiğim sorgu verisi normal görünüyor.

Fakat cevap olarak saçma karakterler geliyor;         _ g   #   ?   s
Gelmesi gereken cevap ise ;                                 +DMOCONNECT: 0


#include <string.h>

char dmo[20];


#int_rda
void serial()
{

disable_interrupts(int_rda);
gets(dmo);

output_toggle(pin_c0);
}




void main() 
{
   port_B_pullups(0x0F);
    
   setup_oscillator(OSC_8MHZ);
   enable_interrupts(int_rda);
   enable_interrupts(global);
   setup_adc_ports(no_analogs);
   setup_adc(adc_off);
   
   
   
   while(TRUE)
   {
   
   enable_interrupts(int_rda);
   output_high(PD);//Power saving control pin: Low sleep mode; High normal mode
   output_low(HL);//RF Power Selection: Low 0.5W; High 1W
  
   haberlesme_test_data(); //gönderilen sorgu fonksiyonu
   printf("%s\r\n",dmo);    //gelen cevap tekrar yollanıyor 


    
   }

}

MrDarK

#6
Bilgisayarda parazit almıyorken mcu'da alıyorsan baud rate veya logic seviyelerinde uyumsuzluk olabilir veya gndlerinde bir problem söz konusudur.

Önerilerim şimdilik bunlar denediğinde bunlarıda göz önünde bulundurursan daha kolay çözeriz sorunu.
Picproje Eğitim Gönüllüleri ~ MrDarK

frederic

#7
Modul standart olarak 9600-8-n-1 olarak ayarlı, picde öyle. Sorun şuki picin gönderdiği ilk sorgu verisi temiz olarak serial monitörden görünürken, picin modulden alıp tekrar module gönderdiği (serial monitörden görebilmek için cevabı) veri saçma.

Serial monitörler bir tek r hattını dinleyebiliyor, tx hattını ancak pc den bir şey gönderirsek görüntüleyebiliyoruz. Şöyle hem tx hem rx hattını dinleme modundan görüntüleyebilen bir program olsaydı çok güzel olurdu.

mesaj birleştirme:: 01 Şubat 2014, 22:53:16

Şimdi aklıma geldi, o normal diye görüntülenebiliyor diye bahsettiğim ilk sorguda aslında ilk denemede aynı saçma karakterleri gösteriyordu, çözüm olarak #use rs232 satırına invert koyduğumda düzeldi. Şimdi gelen verileride sanırım invertlemem lazım, nasıl olacağına dair fikriniz varmıdır?