TI lx4f120 UART Stream Problemi

Başlatan muhendisbey, 24 Ağustos 2014, 14:59:13

muhendisbey

Proje kapsamında değil, meseleyi öğrenmeye çalışıyorum, tezimde kullanacağım.
Siteye bir göz attım, tam da aradığım gibi kodlar ve açıklamaları var.
Bir sorum olacak bu durumda, bu kodların tamamı Keil'de kullanılabilir mi?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

CLR

Keil\ARM\RV31\INC içinde string.h var

orada tanımlı olanları kullanabilirsin, 
Knowledge and Experience are Power

muhendisbey

#17
int n=0;
void
UARTIntHandler(void)
{
    unsigned long ulStatus;
		char  temp[50]; 

 
    ulStatus = UARTIntStatus(UART1_BASE, true);   
 
    temp[n] = UARTCharGet(UART1_BASE);
					  if(strstr(temp, "red")){
						GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
						UARTIntClear(UART1_BASE, ulStatus);
						n=0;
						}
						
						if(strstr(temp, "blue")){
						GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
						UARTIntClear(UART1_BASE, ulStatus);
						n=0;
						}
						
						
						if(strstr(temp, "green")){
						GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);
						UARTIntClear(UART1_BASE, ulStatus);
						n=0;
						}
						if(strstr(temp, "reset")){
						GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
						GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);	
						GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0);
						UARTIntClear(UART1_BASE, ulStatus);
						n=0;
						}
		n=n++;
		if (n==51){n=0;}
		
		if(temp[n]=='\n'){n=0;
		UARTIntClear(UART1_BASE, ulStatus);  }
}


Bu şekilde kodu yazdığımda bir yerden sonra strstr arama yapmayı kesiyor/bulamıyor. Nerede hata yapmış olabilirim?

Array'i temizlemenin döngüsüz bir yolu var mı? Acaba Array içerisindeki önceki karakterlerden etkileniyor olabilir mi?
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

RaMu

Bence bu kontrol metodu iyi değil,
sonuçta son karakter olarak \n gelmesini bekliyorsun,
öyleyse \n gelene kadar sadece gelen verileri
interrupt içinde diziye geldikçe tek tek yaz,
interrupt içinde kontrol yapma,
biliyorsun interrupt içi çok kısa tutulması işlem kalabalığı olmaması gereken biryer
strstr gibi fonksiyonların interrupt içinde düzgün çalışacaklarını hiç düşünmüyorum,
şimdi \n gelene kadar bütün karakterleri aldın,
artık misal veri_tamam diye bir global değişkenin olsun bunu interrupt  içinde set et,
interupt ı kapat, interrupt dan çık,
ana döngüde veri_tamam set ise strstr ile ne gelmiş kontrolünü ve gereken işlemi yap.

Ayrıca char temp [] bu durmda global olarak tanımlanması gerekecek,
bunuda interrupt dışında tanımla,
gelebilecek en uzun eleman sayısı kaç ise o kadar tanımla bence,
şimdilik reset green 5 eleman görünüyor herhalde 2 tanede \n için
8-10 elemanlı tanımlasan yeter sanırım.
veri_tamam değişkenini sıfırla ve interrupt ı tekrar aç
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

muhendisbey

Merhaba hocam
yardımınız için teşekkürler.

Daha önce \n gelene kadarki bütün elemanları diziye yazdım, sonra arama yaptım ancak bu dediğimi de gene interrupt içerisine yazdım.
if(temp[n]=='\n'){} komutunu arama yapılan terimlerin üzerine tanımladım)


En kısa zamanda dediğiniz gibi arama komutunu ana döngüye taşıyıp deneyeceğim.

Ana döngüye eklemek istemememde temel neden sonsuz döngüde arama yapınca işlemci tam kapasite çalışmış olacak. O nedenle interrupt'a eklemiştim.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

RaMu

Hayır hocam sonsuz bir arama yok anlattuğım sistemde,

Keme rutini
{
Tüm değerleri /n gelene kadar buffera yaz,
/n geldiyse veri_tamam değişkenini set et
}

Ana döngü
{
if >>>veri_tamam değişkeni set ise
{ gelen veri neymiş bak gerekeni yap, veri_tamam değişkeninini sıfırla }
else
  kafana göre takıl, istersen sleep

}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html